ByteArrayInputStream與ByteArrayOutputStream

第一次看到ByteArrayOutputStream的時候是在Nutch的部分源碼,後來在涉及IO操做時頻頻發現這兩個類的蹤影,以爲確實是很好用,因此把它們的用法總結一下。數組

  ByteArrayOutputStream的用法緩存

如下是JDK中的記載: 網絡

public class ByteArrayOutputStream  extends OutputStream函數

    此類實現了一個輸出流,其中的數據被寫入一個 byte 數組。緩衝區會隨着數據的不斷寫入而自動增加。可以使用 toByteArray()和 toString()獲取數據spa

    關閉 ByteArrayOutputStream 無效。此類中的方法在關閉此流後仍可被調用,而不會產生任何IOException。文檔

   個人我的理解是ByteArrayOutputStream是用來緩存數據的(數據寫入的目標(output stream原義)),向它的內部緩衝區寫入數據,緩衝區自動增加,當寫入完成時能夠從中提取數據。因爲這個緣由,ByteArrayOutputStream經常使用於存儲數據以用於一次寫入。get

實例:input

從文件中讀取二進制數據,所有存儲到ByteArrayOutputStream中。源碼

FileInputStream fis=new FileInputStream("test");it

BufferedInputStream bis=new BufferedInputStream(fis);

ByteArrayOutputStream baos=new ByteArrayOutputStream();

int c=bis.read();//讀取bis流中的下一個字節

while(c!=-1){

     baos.write(c);

     c=bis.read();

}

bis.close();

byte retArr[]=baos.toByteArray();

 

ByteArrayInputStream的用法

    相對而言,ByteArrayInputStream比較少見。先看JDK文檔中的介紹:

public class ByteArrayInputStreamextends InputStreamByteArrayInputStream 包含一個內部緩衝區,該緩衝區包含從流中讀取的字節。內部計數器跟蹤 read 方法要提供的下一個字節。

關閉 ByteArrayInputStream 無效。此類中的方法在關閉此流後仍可被調用,而不會產生任何 IOException。

構造函數:

ByteArrayInputStream(byte[] buf) 

注意它須要提供一個byte數組做爲緩衝區。

    與大部分Inputstream的語義相似,能夠從它的緩衝區中讀取數據,因此咱們能夠在它的外面包裝另外一層的inputstream以使用咱們須要的讀取方法。

    我的認爲一個比較好的用途是在網絡中讀取數據包,因爲數據包通常是定長的,咱們能夠先分配一個夠大的byte數組,好比byte buf[]=new byte[1024];

而後調用某個方法獲得網絡中的數據包,例如:

Socket s=...;

DataInputStream dis=new DataInputStream(s.getInputStream());

dis.read(buf);//把全部數據存到buf中

ByteArrayInputStream bais=new ByteArrayInputStream(buf); //把剛纔的部分視爲輸入流

DataInputStream dis_2=new DataInputStream(bais);

//如今可使用dis_2的各類read方法,讀取指定的字節

好比第一個字節是版本號,dis_2.readByte();

等等……

上面的示例的兩次包裝看上去有點畫蛇添足,但使用ByteArrayInputStream的好處是關掉流以後它的數據仍然存在。

相關文章
相關標籤/搜索