Java SequenceInputStream构造函数只拾取第一个输入流,而忽略其余部分
我使用SequenceInputStream将多个流合并为一个流。我在JDK8上。下面是代码Java SequenceInputStream构造函数只拾取第一个输入流,而忽略其余部分,java,inputstream,java-io,filemerge,Java,Inputstream,Java Io,Filemerge,我使用SequenceInputStream将多个流合并为一个流。我在JDK8上。下面是代码 private InputStream mergeInputStreams(final Map<String, InputStream> fileAssets, final JSONObject json) throws Exception { final List<InputStream> listStreams = new ArrayList<InputStr
private InputStream mergeInputStreams(final Map<String, InputStream> fileAssets, final JSONObject json) throws Exception {
final List<InputStream> listStreams = new ArrayList<InputStream>();
listStreams.add(stringToStream(HEADER));
addToList(json, listStreams);
listStreams.add(stringToStream(HEADER_2));
addToList(fileAssets.get(FILE_2), listStreams, true);
listStreams.add(stringToStream(HEADER_3));
addToList(fileAssets.get(FILE_3), listStreams, false);
return new SequenceInputStream(Collections.enumeration(listStreams));
}
private void addToList(final InputStream inputStream, List<InputStream> listStreams, final boolean delimiter) throws Exception {
final byte[] input = byteArrayFromStream(inputStream);
listStreams.add(intToStream(input.length));
listStreams.add(new ByteArrayInputStream(input));
if (delimiter) {
listStreams.add(stringToStream("\n"));
}
}
private void addToList(final JSONObject json, final List<InputStream> listStreams) throws Exception {
final String jsonString = json.toString();
listStreams.add(intToStream(jsonString.length()));
listStreams.add(stringToStream(jsonString));
}
在上面的示例中,我尝试合并相同的输入两次。然而,我仍然只得到第9个输入流一次
我已经验证了我在枚举中得到了多个流
如果有人能帮我了解这里发生了什么,那就太好了 它将读取第一个流,直到流结束,然后读取第二个流,依此类推。可能这不是你所期望的?这也意味着您不能两次提供同一个流,因为它在第一次使用时就已经被完全读取了
我看不出构造器与它有什么关系。以下是我们所拥有的:
我们修复了库使用IOUtils.copy()而不是编写依赖available()的复制代码 对。我相信它正在这样做。我只是在试验可用的。它看起来像是逐流返回可用流,也就是说,如果我们有3个流,第一次它将只返回第一个流的可用()计数。看起来我的代码的下游正在使用InputReader对象,直接调用available()来获取这么多字节。我觉得这是不对的。当我发现更多信息时,我会提供更新。它甚至没有义务这样做。如果您希望它返回所有流的总长度,那么Javadoc中特别警告要防止这种误用。
available()的正确用法很少。
不要使用它。我同意。我碰巧检查了正在使用这个的下游库。我建议修改它,使其不使用available()。谢谢,干得好。我仍然觉得人们将available()
用于Javadoc告诉您不要使用它的事情是不可思议的。我将进一步注意到,期望available()
返回底层流的available()
I方法的总和是不合理的。如果第一个流有M个字节“可用”而没有阻塞,还有N个字节可通过阻塞读取,那么可以从其他流中读取什么而没有阻塞是完全不相关的,因为N个字节必须先读取。
new SequenceInputStream(listStreams.get(9), listStreams.get(9));