2015-04-28 20 views
2

我正在使用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個輸入流。

我已經驗證我確實在枚舉中獲得了多個流。

如果有人能幫助我理解這裏發生了什麼,那將會很棒。

回答

1

它將讀取第一個流直到流結束,然後第二個,依此類推。可能這不是你所期望的?這也意味着你不能提供兩次相同的流,因爲它在第一次使用時已經被完全讀取。

我不明白構造函數與它有什麼關係。

+0

是的。我相信它是這樣做的。我只是試驗可用。它看起來像它按流返回可用的流,即如果我們有3個流,它第一次將返回只有第一個流的available()計數。它看起來像我的代碼的下游消耗InputReader對象直接調用available()來獲取這些字節。這對我來說似乎是錯誤的。我會提供更新,因爲我發現更多。 – Abhishek

+1

甚至沒有義務這樣做。如果您希望它能夠返回所有流的總長度,那是在Javadoc中特別警告的誤用。 'available()'的正確用法很少,不要使用它。 – EJP

+0

我同意。我碰巧檢查了使用這個的下游庫。讓我建議修改它,以便它不使用available()。謝謝。 – Abhishek

0

下面是我們所擁有的:

  1. 從 'N' 創建的SequenceInputStream對象的「
  2. 上傳的」給S3使用外部庫流。 lib.uploadToS3(S)

問題: 第三方庫uploadToS3(流)呼叫,使用stream.available()來初始化緩衝器陣列,並將其從流和上傳填充它。

它看起來像SequenceInputStream.available()(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/SequenceInputStream.java)從它迭代的當前流返回available()。例如在lib.uploadToS3()的上下文中,它使用序列中第一個流的available()。

我們固定: 我們定要使用的庫IOUtils.copy(),而不是寫依賴於可用的副本碼()。

+0

幹得好。我繼續發現,人們會使用'available()'來表達Javadoc告訴你不要使用它的事情。 – EJP

相關問題