ByteInputStream、ByteOutputStream



以下是JDK中的記載: 

public class ByteArrayOutputStream  extends OutputStream

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

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

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

ByteArrayOutputStream類是在創建它的實例時,程序內部創建一個byte型別數組的緩衝區,然後利用ByteArrayOutputStream和ByteArrayInputStream的實例向數組中寫入或讀出byte型數據。在網絡傳輸中我們往往要傳輸很多變量,我們可以利用ByteArrayOutputStream把所有的變量收集到一起,然後一次性把數據發送出去。具體用法如下:

ByteArrayOutputStream:    可以捕獲內存緩衝區的數據,轉換成字節數組。

ByteArrayInputStream: 可以將字節數組轉化爲輸入流


ByteArrayInputStream類有兩個默認的構造函數:

ByteArrayInputStream(byte[] b): 使用一個字節數組當中所有的數據做爲數據源,程序可以像輸入流方式一樣讀取字節,可以看做一個虛擬的文件,用文件的方式去讀取它裏面的數據。

ByteArrayInputStream(byte[] b,int offset,int length): 從數組當中的第offset開始,一直取出length個這個字節做爲數據源。

ByteArrayOutputStream類也有兩個默認的構造函數:

ByteArrayOutputStream(): 創建一個32個字節的緩衝區

ByteArrayOutputStream(int): 根據參數指定大小創建緩衝區

這兩個構造函數創建的緩衝區大小在數據過多的時候都會自動增長,如果創建緩衝區以後,程序就可以把它像虛擬文件一樣似的往它裏面寫入內容,當寫完內容以後調用ByteArrayOutputStream()的方法就可以把其中的內容當作字節數組返回。
ByteArrayInputStream可以將一個數組當作流輸入的來源,而ByteArrayIOutputStream則可以將一個位數組當作流輸出的目的地。

實例:

從文件中讀取二進制數據,全部存儲到ByteArrayOutputStream中。

FileInputStream fis=new FileInputStream("test");

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的好處是關掉流之後它的數據仍然存在。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章