我使用Spring框架,并使用流解析返回一个.txt文件供用户下载。
数据的结果很好,但是,在每一列数据前面都有一个t,除了最后一列,每一列的末尾都有'w‘。
我不明白为什么,因为数据似乎很好,我也没有让程序创建这封信。
这是我的代码:
// A list of String, which are the data, it might looks like 20200810,a,b,c,100,55,.....
// the whole is a String contains comma
List<String> dataList = (List<String>) parameters.get("myData");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
StreamingResolution streamingResolution = null;
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
oos.writeObject("\n");
for (String s : dataList) {
oos.writeObject(s.trim());
oos.writeUTF("\n");
}
streamingResolution = new StreamingResolution("text/plain", new ByteArrayInputStream(outputStream.toByteArray()));
streamingResolution.setCharacterEncoding(CharEncoding.UTF_8);
String year = Integer.toString((Integer.parseInt(end.substring(0, 4));
String day = year + end.substring(4, 6);
oos.close();
return streamingResolution.setFilename(day + ".txt");当我下载数据时,202108.txt看起来可能是
T ?0210810,a,b,c,100,55 w
T ?0210810,d,e,f,99,60
谁能告诉我为什么前面有个t,最后有一个w?以及如何解决这个问题?
非常感谢。
发布于 2021-08-10 02:41:38
此代码使用ObjectOutputStream,用于以二进制格式编写序列化的Java数据。它不是纯文本格式,不应该以这种方式使用。额外的字符是在Java对象序列化规范中定义的字节。
要编写纯文本,可以使用java.io.PrintStream类。例如:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(outputStream, false, StandardCharsets.UTF_8);
printStream.println();
for (String s : dataList) {
printStream.println(s.trim());
}
printStream.flush();
StreamingResolution streamingResolution = new StreamingResolution("text/plain", new ByteArrayInputStream(outputStream.toByteArray()));
streamingResolution.setCharacterEncoding(CharEncoding.UTF_8);注意,我还通过将streamingResolution局部变量声明移到分配它的位置简化了代码。
这是对所提供的代码的简单转换,以向您展示如何使用PrintStream类,但是它可能不是编写它的最佳方法。StreamingResolution类似乎是条纹框架的一部分。它的目的是向客户端提供大量响应。但是,这个实现实际上并不是流响应,而是将其累加到一个字节数组中。实现这一点的一个更好的方法是对StreamingResponse类进行子类分类,如Stripe文档中所描述的那样,直接写入响应:
return new StreamingResolution("text/plain") {
public void stream(HttpServletResponse response) throws Exception {
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println();
for (String s : dataList) {
out.println(s.trim());
}
out.flush();
}
}.setFilename(day + ".txt");https://stackoverflow.com/questions/68720251
复制相似问题