我正在使用SequenceInputStream將多個流合併成一個流。我在JDK8上。以下是代碼。SequenceInputStream構造函數只挑選第一個輸入流並忽略其餘部分
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));
在上面的例子中,我試圖合併兩次相同的輸入。但是,我仍然只能得到第9個輸入流。
我已經驗證我確實在枚舉中獲得了多個流。
如果有人能幫助我理解這裏發生了什麼,那將會很棒。
是的。我相信它是這樣做的。我只是試驗可用。它看起來像它按流返回可用的流,即如果我們有3個流,它第一次將返回只有第一個流的available()計數。它看起來像我的代碼的下游消耗InputReader對象直接調用available()來獲取這些字節。這對我來說似乎是錯誤的。我會提供更新,因爲我發現更多。 – Abhishek
甚至沒有義務這樣做。如果您希望它能夠返回所有流的總長度,那是在Javadoc中特別警告的誤用。 'available()'的正確用法很少,不要使用它。 – EJP
我同意。我碰巧檢查了使用這個的下游庫。讓我建議修改它,以便它不使用available()。謝謝。 – Abhishek