程序使用字節流來執行8位字節的輸入和輸出,全部的字節流類都是從InputStream和OutputStream派生出來的。html
有許多字節流類,爲了演示字節流的工做原理,咱們將重點關注文件I/O字節流,FileInputStream和FileOutputStream,其餘類型的字節流以大體相同的方式使用,它們的不一樣之處主要在於它們的構造方式。java
咱們將經過檢查名爲CopyBytes的示例程序來探索FileInputStream
和FileOutputStream
,該程序使用字節流來複制xanadu.txt
,一次一個字節。git
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("xanadu.txt"); out = new FileOutputStream("outagain.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
CopyBytes
將大部分時間花在一個簡單的循環中,該循環讀取輸入流和寫入輸出流,一次一個字節,以下圖所示。github
在再也不須要流時關閉流很是重要 — 很是重要的是CopyBytes
使用finally
塊來保證即便發生錯誤也會關閉兩個流,這種作法有助於避免嚴重的資源泄漏。segmentfault
一個可能的錯誤是CopyBytes
沒法打開一個或兩個文件,發生這種狀況時,對應於該文件的流變量永遠不會從其初始null
值更改,這就是爲何CopyBytes
在調用close
以前確保每一個流變量都包含一個對象引用。api
CopyBytes
看起來像一個普通的程序,但它實際上表明瞭一種你應該避免的低級別I/O,因爲xanadu.txt
包含字符數據,所以最好的方法是使用字符流,以下一節中所述。還有用於更復雜數據類型的流,字節流應僅用於最原始的I/O。oracle
那麼爲何要談論字節流呢?由於全部其餘流類型都是基於字節流構建的。spa