Java SequenceInputStream构造函数只拾取第一个输入流,而忽略其余部分

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

我使用SequenceInputStream将多个流合并为一个流。我在JDK8上。下面是代码

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个输入流一次

我已经验证了我在枚举中得到了多个流


如果有人能帮我了解这里发生了什么,那就太好了

它将读取第一个流,直到流结束,然后读取第二个流,依此类推。可能这不是你所期望的?这也意味着您不能两次提供同一个流,因为它在第一次使用时就已经被完全读取了


我看不出构造器与它有什么关系。

以下是我们所拥有的:

  • 从“n”个流创建sequenceinputstream对象“s”
  • 使用外部库将“s”上载到S3。库上载到3(s)
  • 问题: 第三方库uploadToS3(stream)调用使用stream.available()初始化缓冲区数组,并从流中填充它并进行上载

    它看起来像SequenceInputStream.available()()从当前流返回available()。e、 g.在lib.uploadToS3()的上下文中,它使用序列中第一个流中的available()

    我们修复的内容:
    我们修复了库使用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));