java—如何通过http将字符串数组作为字节数组进行流式处理,以便接收者可以从中创建一个文件?

bnlyeluc  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(430)

我在服务器端有一个字符串数组,数组中的每一项基本上都是最终输出文件中的一行。我不想在服务器端创建这个最终的输出文件,而是希望将这个字符串数组作为字节数组进行流式处理,以便可以在客户端写入响应主体,并以流式格式创建相应的文件。
我尝试了以下代码:

String[] convert = MyClass.myMethodWhichGenerateTheStringArray();

final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

objectOutputStream.writeBytes("\n");
for(String s: convert)
{
    objectOutputStream.writeBytes(s + "\n");
}
objectOutputStream.flush();
objectOutputStream.close();

final byte[] byteArray = byteArrayOutputStream.toByteArray();
return request.createResponseBuilder(HttpStatus.OK).body(byteArray).build();

当我读取创建的文件时,我看到一些随机字符,如下所示:


在客户端,我所做的就是:

import requests

url = "http://localhost:8081/api/MyFunction"

payload = "{\n    \"fileName\": \"ABCD\",\n    \"fileUrl\": \"https://dahfafj\",\n    \"inputFormat\": \"A\",\n    \"outputFormat\": \"B\"\n}"
headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data = payload)

file = open("resp_text.srt", "wb")
file.write(response.text.encode('utf8'))
file.close()

我的方法对吗?我应该怎么做来修复文件中打印的垃圾字符?

64jmpszr

64jmpszr1#

你到处都是这个。

objectoutputstream-不要使用此

oos和ois(主要)是用于java序列化的,这是您不想要的(来源:目前负责java的团队感叹这是多么糟糕),您也不需要这里。停止使用这个;发送字节数组不需要oos。只是普通的简 OutputStream 这就是你想要的。

字符集

每当您将字符串转换为字节或将字符串转换为字节时,总会涉及到一个字符集。如果不指定一个,则会得到“platform default”,这是一种表示“总是完全错误的事情”的好方法。所以,你知道-你的测试通过了,当数百万美元投入生产时,它就会失败。始终显式指定所需的字符集。除非api说明始终使用特定的硬编码字符集(例如,新文件api硬编码utf-8,因此那些“无字符集”方法 Files.readAllLines 你没事吧。但大多数将字符转换为字节或反之亦然的javaapi调用都默认为平台默认值,这是您永远不希望看到的!)。
注意,在python方面,您确实学到了这一课,并指定了utf-8。您在java方面未能做到这一点。

分离器

您说要“发送字符串数组中的每个元素”。你的协议是什么?只需一个接一个地发送一个字符串,就可以知道“下一行”何时发生?你想要一个换行符吗?这应该是windows风格的新行吗( \r\n 或mac/unix/网络风格 \n ?).
从你的代码看来 \n 分离器。
让我们把它放在一起:

String[] convert = MyClass.myMethodWhichGenerateTheStringArray();

var bytes = new ByteArrayOutputStream();
var out = new OutputStreamWriter(bytes, StandardCharsets.UTF_8);

out.write("\n");
for(String s : convert) {
    out.write(s);
    out.write("\n");
}
out.close();
request.createResponseBuilder(HttpStatus.OK).body(bytes.toByteArray()).build();

或者,重写一些内容,使其更简短:

String[] convert = MyClass.myMethodWhichGenerateTheStringArray();
byte[] data = ("\n" + String.join("\n", convert)).getBytes(StandardCharsets.UTF_8);
request.createResponseBuilder(HttpStatus.OK).body(data).build();

相关问题