Java IO: 流

喝水會長肉發表於2021-11-27

Java IO流是既可以從中讀取,也可以寫入到其中的資料流。正如這個系列教程之前提到過的,流通常會與資料來源、資料流向目的地相關聯,比如檔案、網路等等。

流和陣列不一樣,不能通過索引讀寫資料。在流中,你也不能像陣列那樣前後移動讀取資料,除非使用RandomAccessFile 處理檔案。流僅僅只是一個連續的資料流。


某些類似PushbackInputStream 流的實現允許你將資料重新推回到流中,以便重新讀取。然而你只能把有限的資料推回流中,並且你不能像運算元組那樣隨意讀取資料。流中的資料只能夠順序訪問。

Java IO流通常是基於位元組或者基於字元的。位元組流通常以“stream”命名,比如InputStream和OutputStream。除了DataInputStream 和DataOutputStream 還能夠讀寫int, long, float和double型別的值以外,其他流在一個操作時間內只能讀取或者寫入一個原始位元組。

字元流通常以“Reader”或者“Writer”命名。字元流能夠讀寫字元(比如Latin1或者Unicode字元)。可以瀏覽Java Readers and Writers獲取更多關於字元流輸入輸出的資訊。

InputStream

java.io.InputStream類是所有Java IO輸入流的基類。如果你正在開發一個從流中讀取資料的元件,請嘗試用InputStream替代任何它的子類(比如FileInputStream)進行開發。這麼做能夠讓你的程式碼相容任何型別而非某種確定型別的輸入流。

然而僅僅依靠InputStream並不總是可行。如果你需要將讀過的資料推回到流中,你必須使用PushbackInputStream,這意味著你的流變數只能是這個型別,否則在程式碼中就不能呼叫PushbackInputStream的unread()方法。

通常使用輸入流中的read()方法讀取資料。read()方法返回一個整數,代表了讀取到的位元組的內容(譯者注:0 ~ 255)。當達到流末尾沒有更多資料可以讀取的時候,read()方法返回-1。

這是一個簡單的示例:

InputStream input 
= 
new 
FileInputStream
(
"c:\\data\\input-file.txt"
)
;


int data = input . read ( ) ;  

while (data != - 1 ) {

       data = input . read ( ) ;
}

OutputStream

java.io.OutputStream是Java IO中所有輸出流的基類。如果你正在開發一個能夠將資料寫入流中的元件,請嘗試使用OutputStream替代它的所有子類。

這是一個簡單的示例:


//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!

OutputStream output = new FileOutputStream ( "c:\\data\\output-file.txt" ) ;

output . write ( "Hello World" . getBytes ( ) ) ;

output . close ( ) ;

組合流

你可以將流整合起來以便實現更高階的輸入和輸出操作。比如,一次讀取一個位元組是很慢的,所以可以從磁碟中一次讀取一大塊資料,然後從讀到的資料塊中獲取位元組。為了實現緩衝,可以把InputStream包裝到BufferedInputStream中。程式碼示例:

InputStream input 
= 
new 
BufferedInputStream
( 

  new FileInputStream ( "c:\\data\\input-file.txt" )
                   
) ;

緩衝同樣可以應用到OutputStream中。你可以實現將大塊資料批量地寫入到磁碟(或者相應的流)中,這個功能由BufferedOutputStream實現。

緩衝只是通過流整合實現的其中一個效果。你可以把InputStream包裝到PushbackInputStream中,之後可以將讀取過的資料推回到流中重新讀取,在解析過程中有時候這樣做很方便。或者,你可以將兩個InputStream整合成一個SequenceInputStream。

將不同的流整合到一個鏈中,可以實現更多種高階操作。通過編寫包裝了標準流的類,可以實現你想要的效果和過濾器。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2844426/,如需轉載,請註明出處,否則將追究法律責任。

相關文章