簡體   English   中英

Chunkwise-Copy數據從InputStream到OutputStream +最后得到byte []

[英]Chunkwise-Copy data from InputStream to OutputStream + getting byte[] at the end

我知道如何將chunkwise從InputStream復制到OutputStream

我知道如何從InputStream獲取byte[]

但是如何一步到位呢? 是否有一個OutputStream可以通過管道傳輸緩沖所有寫入的字節,以便它可以在結尾返回一個byte []?

我需要像ByteArrayOutputStream這樣的東西,但可以用管道傳輸。 (例如,到FileOutputStream)

或者我需要像MultiOutputStream這樣可以轉發到多個OutputStream的東西。 使用Guava和/或Apache Commons的解決方案是首選。 :)

你應該看一下Apache的TeeOutputStreamhttpsTeeOutputStream

擴展OutputStream並通過在兩個內部流(ByteArrayOutputStream和FileOutputStream)上包裝(如裝飾器)來創建自定義MultiOutputStream。 您可以將兩個流作為構造函數args。 覆蓋相應的寫入方法並寫入兩個目標流。

例如

  class MultiOuputStream extends OutputStream {

   private OutputStream stream1; 
   private OutputStream stream2;

   public MultiOuputStream(){
    // can throw exception, not supported
   }

   public MultiOuputStream(OutputStream stream1, OutputStream stream2){
     this.stream1 = stream1;
     this.stream2 = stream2;
   }

   @Override
   public write(byte[] bytes) throws IOException {
     stream1.write(bytes);
     stream2.write(bytes);
   }

   ...
   ...
}

我考慮使用TeeOutputStream ,但是它的close() - Method在關閉主流時沒有關閉分支流拋出異常。 因此,當發生異常時,我必須自己關閉分支流。 由於java的流鏈接的概念,這是非常不切實際的。 由於這種行為至少沒有記錄,我稱之為bug

當我使用ByteArrayOutputStream作為TeeOutputStreams分支到的流之一時,這不是一個真正的問題。 但這只是因為不能關閉ByteArrayOutputStreams

這就是我編寫MultiOutputStream的原因。 它與TeeOutputStream非常相似,但即使在兩者之間出現異常時也會關閉其底層流。 此外,它允許多個分支流,而不僅僅是一個。

編輯
今天修復了TeeOutputStream中的錯誤。 它將與Commons IO 2.2一起發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM