Java IO: 流
轉載自??Java IO: 流
原文鏈接?作者:?Jakob?Jenkov?譯者:?李璟(jlee381344197@gmail.com)
Java?IO流是既可以從中讀取,也可以寫入到其中的數(shù)據(jù)流。正如這個系列教程之前提到過的,流通常會與數(shù)據(jù)源、數(shù)據(jù)流向目的地相關聯(lián),比如文件、網(wǎng)絡等等。
流和數(shù)組不一樣,不能通過索引讀寫數(shù)據(jù)。在流中,你也不能像數(shù)組那樣前后移動讀取數(shù)據(jù),除非使用RandomAccessFile?處理文件。流僅僅只是一個連續(xù)的數(shù)據(jù)流。
某些類似PushbackInputStream?流的實現(xiàn)允許你將數(shù)據(jù)重新推回到流中,以便重新讀取。然而你只能把有限的數(shù)據(jù)推回流中,并且你不能像操作數(shù)組那樣隨意讀取數(shù)據(jù)。流中的數(shù)據(jù)只能夠順序訪問。
Java?IO流通常是基于字節(jié)或者基于字符的。字節(jié)流通常以“stream”命名,比如InputStream和OutputStream。除了DataInputStream?和DataOutputStream?還能夠讀寫int,?long,?float和double類型的值以外,其他流在一個操作時間內只能讀取或者寫入一個原始字節(jié)。
字符流通常以“Reader”或者“Writer”命名。字符流能夠讀寫字符(比如Latin1或者Unicode字符)。可以瀏覽Java?Readers?and?Writers獲取更多關于字符流輸入輸出的信息。
InputStream
java.io.InputStream類是所有Java?IO輸入流的基類。如果你正在開發(fā)一個從流中讀取數(shù)據(jù)的組件,請嘗試用InputStream替代任何它的子類(比如FileInputStream)進行開發(fā)。這么做能夠讓你的代碼兼容任何類型而非某種確定類型的輸入流。
然而僅僅依靠InputStream并不總是可行。如果你需要將讀過的數(shù)據(jù)推回到流中,你必須使用PushbackInputStream,這意味著你的流變量只能是這個類型,否則在代碼中就不能調用PushbackInputStream的unread()方法。
通常使用輸入流中的read()方法讀取數(shù)據(jù)。read()方法返回一個整數(shù),代表了讀取到的字節(jié)的內容(譯者注:0?~?255)。當達到流末尾沒有更多數(shù)據(jù)可以讀取的時候,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中所有輸出流的基類。如果你正在開發(fā)一個能夠將數(shù)據(jù)寫入流中的組件,請嘗試使用OutputStream替代它的所有子類。
這是一個簡單的示例:
組合流
你可以將流整合起來以便實現(xiàn)更高級的輸入和輸出操作。比如,一次讀取一個字節(jié)是很慢的,所以可以從磁盤中一次讀取一大塊數(shù)據(jù),然后從讀到的數(shù)據(jù)塊中獲取字節(jié)。為了實現(xiàn)緩沖,可以把InputStream包裝到BufferedInputStream中。代碼示例:
緩沖同樣可以應用到OutputStream中。你可以實現(xiàn)將大塊數(shù)據(jù)批量地寫入到磁盤(或者相應的流)中,這個功能由BufferedOutputStream實現(xiàn)。
緩沖只是通過流整合實現(xiàn)的其中一個效果。你可以把InputStream包裝到PushbackInputStream中,之后可以將讀取過的數(shù)據(jù)推回到流中重新讀取,在解析過程中有時候這樣做很方便。或者,你可以將兩個InputStream整合成一個SequenceInputStream。
將不同的流整合到一個鏈中,可以實現(xiàn)更多種高級操作。通過編寫包裝了標準流的類,可以實現(xiàn)你想要的效果和過濾器。
總結
以上是生活随笔為你收集整理的Java IO: 流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李彦宏攥紧AI
- 下一篇: 华为5G消失的1083天:“过重山”的华