Java™ 教程(字節流)

字節流

程序使用字節流來執行8位字節的輸入和輸出,全部的字節流類都是從InputStreamOutputStream派生出來的。html

有許多字節流類,爲了演示字節流的工做原理,咱們將重點關注文件I/O字節流,FileInputStreamFileOutputStream,其餘類型的字節流以大體相同的方式使用,它們的不一樣之處主要在於它們的構造方式。java

使用字節流

咱們將經過檢查名爲CopyBytes的示例程序來探索FileInputStreamFileOutputStream,該程序使用字節流來複制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

byteStream.gif

始終關閉流

在再也不須要流時關閉流很是重要 — 很是重要的是CopyBytes使用finally塊來保證即便發生錯誤也會關閉兩個流,這種作法有助於避免嚴重的資源泄漏。segmentfault

一個可能的錯誤是CopyBytes沒法打開一個或兩個文件,發生這種狀況時,對應於該文件的流變量永遠不會從其初始null值更改,這就是爲何CopyBytes在調用close以前確保每一個流變量都包含一個對象引用。api

什麼時候不使用字節流

CopyBytes看起來像一個普通的程序,但它實際上表明瞭一種你應該避免的低級別I/O,因爲xanadu.txt包含字符數據,所以最好的方法是使用字符流,以下一節中所述。還有用於更復雜數據類型的流,字節流應僅用於最原始的I/O。oracle

那麼爲何要談論字節流呢?由於全部其餘流類型都是基於字節流構建的。spa


上一篇:I/O流

下一篇:字符流

相關文章
相關標籤/搜索