IO 輸入與輸出(3) -- 節點流之五ByteArrayInputStream和ByteArrayOutputStream類

   

    內存虛擬文件和內存映象文件其實就是把內存中的一塊數據存儲緩衝區虛擬成一個文件,原來該寫入硬盤上的內容可以被寫到內存中,原來該從硬盤中讀取的內容也可以從內存中讀取。要在程序中定義一個大的程序緩衝區,這個緩衝區通常就是一個字節數組。在Java中定義了兩個專門的類,ByteArrayInputStream類和ByteArrayOutputStream類,用於以IO流的方式來完成對字節數組內容的讀寫,來支持類似內存虛擬文件或者內存映像文件的功能。

 

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

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

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

 

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

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

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

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

 

通過這兩個類可以實現諸如屏幕共享軟件的程序。

 

下面來看個例子:編寫一個把輸入流中的所有英文字母變成大寫字母,然後將結果寫入到一個輸出流對象。用這個函數來將一個字符串中的所有字符轉換成大寫。

 

ByteArrayTest.java

 

一個字符串其實就相當於一個字符數據的存儲緩衝區,JDK中還提供了StringReaderStringWriter類來以字符IO流的形式處理字符串,這兩個類分別對應ByteArrayInputStream類和ByteArrayOutputStream類。

 

在編寫與IO流相關的程序代碼時,一定要考慮好程序代碼的可複用性,可以從下面幾個方面考慮:

 

1.       System.in是連接到鍵盤的,它是InputStream類型的實例對象,System.out是連接到顯示器,是PrintStream類的實例對象。程序可以使用System.in來讀取鍵盤上的數據,可以使用System.out來將數據輸出到顯示器上,鍵盤被當作一個特殊的輸入文件,顯示器被當作一個特殊的輸出文件處理

 

2.       無論是文件流還是網絡流,它都有一個結束標記來表示底層物理設備中的數據的中止點,不管底層物理設備用什麼樣的方式來實現數據的終止點,InputStream類的read()總是返回-1來表示輸入流的結束。

 

3.       Windows下,按下Ctrl+Z組合鍵可以產生鍵盤輸入流的結束標記,而在Linux下則是是Ctrl+D

 

上面的例子中:transform(System.in,System.out);就用於從鍵盤接收數據,並轉換輸出到命令行。

 

建議:如果要編寫從鍵盤上連續讀取一大段數據的時候,應該儘量將讀取數據的過程放在函數中完成,並且使用-1作爲鍵盤輸入的結束點,在函數中編寫的程序代碼不應直接使用System.in來讀取數據,而是用一個InputStream類型的形式參數對象來讀取數據,然後將System.in作爲實參來傳遞給InputStream類型的形式參數來調用該函數。

 

版權聲明: 原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。

 

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