1

SequenceInputStream を使用して、複数のストリームを 1 つのストリームにマージしています。私は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 オブジェクトから最初のストリームを取得することです。つまり、HEADER 文字列を取得するだけです。など、いくつかのオプションを試しました

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

上記の例では、同じ入力を 2 回マージしようとしています。ただし、9 番目の入力ストリームは 1 回しか取得できません。

列挙で複数のストリームを取得することを確認しました。

誰かがここで何が起こっているのかを理解するのを手伝ってくれたらうれしいです.

4

2 に答える 2

2

ストリームの終わりまで最初のストリームを読み取り、次に 2 番目のストリームを読み取ります。おそらくそれはあなたが期待しているものではありませんか?これはまた、最初の使用ですでに完全に読み取られているため、同じストリームを 2 回提供できないことを意味します。

コンストラクターがそれと何の関係があるのか​​ わかりません。

于 2015-04-28T08:30:09.093 に答える