首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用流解析时列前面有't‘,返回字节数组输出流?

为什么在使用流解析时列前面有't‘,返回字节数组输出流?
EN

Stack Overflow用户
提问于 2021-08-10 01:52:07
回答 1查看 45关注 0票数 0

我使用Spring框架,并使用流解析返回一个.txt文件供用户下载。

数据的结果很好,但是,在每一列数据前面都有一个t,除了最后一列,每一列的末尾都有'w‘。

我不明白为什么,因为数据似乎很好,我也没有让程序创建这封信。

这是我的代码:

代码语言:javascript
复制
// 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?以及如何解决这个问题?

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-10 02:41:38

此代码使用ObjectOutputStream,用于以二进制格式编写序列化的Java数据。它不是纯文本格式,不应该以这种方式使用。额外的字符是在Java对象序列化规范中定义的字节。

要编写纯文本,可以使用java.io.PrintStream类。例如:

代码语言:javascript
复制
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文档中所描述的那样,直接写入响应:

代码语言:javascript
复制
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");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68720251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档