sequenceinputstream构造函数只选取第一个输入流,而忽略其余的

col17t5w  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(329)

我使用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));
}

我遇到的问题是,我总是从sequenceinputstream对象获取第一个流,即,我只获取头字符串。我试过几种选择,包括

new SequenceInputStream(listStreams.get(9), listStreams.get(9));

在上面的例子中,我尝试两次合并相同的输入。但是,我仍然只得到第9个输入流一次。
我已经验证了枚举中确实有多个流。
如果有人能帮我理解这里发生了什么就太好了。

lyfkaqu1

lyfkaqu11#

它将读取第一个流,直到流结束,然后读取第二个流,依此类推。可能这不是你所期望的?这也意味着不能两次提供同一个流,因为在第一次使用时它已经被完全读取了。
我看不出建设者和它有什么关系。

kmpatx3s

kmpatx3s2#

我们有:
从“n”个流创建sequenceinputstream对象“s”
使用外部库将“s”上载到s3。库上载到3(s)
问题:第三方库uploadtos3(stream)调用使用stream.available()初始化缓冲区数组,并从流中填充它并上载。
看起来像sequenceinputstream.available()(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/sequenceinputstream.java)从当前流返回available(),并对其进行迭代。e、 g.在lib.uploadtos3()的上下文中,它使用序列中第一个流的available()。
我们修复了:我们修复了库以使用ioutils.copy(),而不是编写依赖available()的复制代码。

相关问题