我在服务器端有一个字符串数组,数组中的每一项基本上都是最终输出文件中的一行。我不想在服务器端创建这个最终的输出文件,而是希望将这个字符串数组作为字节数组进行流式处理,以便可以在客户端写入响应主体,并以流式格式创建相应的文件。
我尝试了以下代码:
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()
我的方法对吗?我应该怎么做来修复文件中打印的垃圾字符?
1条答案
按热度按时间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
分离器。让我们把它放在一起:
或者,重写一些内容,使其更简短: