1. 程式人生 > >Java 輸出流轉輸入流的方法(OutputStream轉InputStream,Writer轉Reader)

Java 輸出流轉輸入流的方法(OutputStream轉InputStream,Writer轉Reader)

  如果你曾經使用過Java IO 程式設計,很可能會遇到這樣一個狀況,在一個類中向OutputStream裡面寫資料,而另一個類則從InputStream中讀取這些資料。這時問題就出現了,“如何才能把OutputStream裡的資料轉換為InputStream裡的資料呢?”。

  在Java裡,並沒有一個OutpStreamToInputStreamConverter 的類。 但慶幸的是還是有幾個方法可以辦到。

  方法1:使用byte陣列作為快取

  最簡單的方法就是使用byte 陣列作為快取。程式碼示例如下:

  這樣就行了,OutputStream已經轉換為InputStream。

  方法2:使用管道

  方法1的問題是你必須有足夠大的快取來儲存所有的資料。很可能就需要使用檔案系統而不是記憶體,但是不論哪種方法都對能處理的資料存規模存在嚴格的限制。解決的方法是在一個執行緒中往PipedOutputStream裡面寫資料,而當前執行緒則繼續讀另一個執行緒輸入的資料。

方法3:使用迴圈快取

  方法2裡面的兩個管道實際上是維護了一個隱藏的迴圈快取。所以明確的使用一個迴圈快取可以更加簡便。迴圈快取提供瞭如下幾種好處:

  • 一個迴圈快取類替代兩個管道類
  • 可以很容易的在“快取所有資料”和“多執行緒”方法間切換
  • 你可以改變快取的大小,而不是依賴於管道內硬編碼的1k的快取

  多執行緒使用迴圈快取的示例如下:

單執行緒迴圈快取示例如下:

Writer到Reader 的轉換方法與上述方法類似,下面僅舉例,不做詳細說明了。

  方法4:使用快取陣列

方法5:使用管道

方法6:使用迴圈快取

多執行緒示例

單執行緒示例