【发布时间】:2016-10-25 10:37:56
【问题描述】:
我有一个字符串流。每个字符串代表这样的 json 对象,例如:
// {"foo": "bar", "bar": "foo"}
String s1 = "{\"foo\": \"bar\", \"bar\": \"foo\"}";
我从数据库中获取大量数据,这就是我使用 Stream 的原因。 我想将此数据流式传输到 http 响应的输出。
try (Stream<String> data = service.streamData()) {
os.write("[".getBytes());
eventStream.forEach(s -> {
try {
os.write(s.getBytes());
os.write(",".getBytes());
os.write("\n".getBytes());
} catch (IOException e) {
logger.error(e.getMessage());
}
});
}
os.write("{}]".getBytes());
os.flush();
由于每个字符串代表一个 json 对象,我想返回这些对象的数组。在这种情况下,我必须手动添加"[" 和"]",并使用逗号分隔流中的每个元素。但最终我也会在最新的元素后面加一个逗号。这将不是一个有效的 json。
看起来像这样:
["{"foo": "bar", "bar": "foo"}", "{"foo": "bar1", "bar": "foo1"}",]
任何想法如何使用流摆脱最新的逗号?
【问题讨论】:
-
蹩脚(但常见)的方法是不在每条消息之后输出逗号,而是在每条消息之前输出它(第一个除外,可以通过布尔值处理)。跨度>
-
另一种蹩脚(但常见)的方法是仅附加一个虚拟条目(假设您可以让客户端代码忽略它)。
-
Thilo,谢谢你的回答,我有点喜欢你的第一个建议,你能告诉我当我在流中使用每个元素时如何检查元素是否是第一个?
-
您可以有一个 StringBuilder,在流的每次迭代中,您可以将
",\n"附加到(如果它为空)或输出(如果它不为空)。 -
附带说明,
os.write("[".getBytes());、os.write(",".getBytes());和os.write("\n".getBytes());是非常低效且无意中依赖于平台的方式来执行os.write('[');、os.write(',');和os.write('\n');...
标签: java json stream java-8 java-stream