天天看點

系統學習 Java IO----目錄,概覽

Java IO 類的系統教程,原創。主要參考自英文教程 Java IO Tutorial 和 Java Doc。

http://tutorials.jenkov.com/java-io/index.html

目的: 掌握 Java IO 幾乎所有類的基礎用法,完全知道什麼時候應該使用什麼類。

分開學習,先系統學習 IO 所有的類,再另外學習 NIO 。

目錄:

  1. 系統學習 Java IO (一)----輸入流和輸出流 InputStream/OutputStream
  2. 系統學習 Java IO (二)----IO 異常處理
  3. 系統學習 Java IO (三)----檔案類 File
  4. 系統學習 Java IO (四)----檔案的讀寫和随機通路 FileInputStream/FileOutputStream & RandomAccessFile
  5. 系統學習 Java IO (五)----使用 SequenceInputStream 組合多個流
  6. 系統學習 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
  7. 系統學習 Java IO (七)----位元組數組流 ByteArrayInputStream/ByteArrayOutputStream
  8. 系統學習 Java IO (八)----裝飾流 FilterInputStream/FilterOutputStream
  9. 系統學習 Java IO (九)----緩沖流 BufferedInputStream/BufferedOutputStream
  10. 系統學習 Java IO (十)----回退流 PushbackInputStream
  11. 系統學習 Java IO (十一)----列印流 PrintStream
  12. 系統學習 Java IO (十二)----資料流和對象流
  13. 系統學習 Java IO (十三)----字元讀寫 Reader/Writer 及其常用子類
  14. 系統學習 Java IO (十四)----字元讀寫緩存和回退 BufferedReader/BufferedWriter & PushbackReader
  15. 系統學習 Java IO (十五)----字元讀寫 Reader/Writer 其他子類
  16. 系統學習 Java IO (十六)----這麼多類,應該用哪個?

先放一張 IO 類圖,看着有點多(本教程還包含了一些不在這圖裡的),不要怕,跟着 Jenkov 大神走,一個一個來,都能掌握的。

系統學習 Java IO----目錄,概覽
部分内容概覽

Java.io

包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目标。

System.in

System.out

System.err

這三個流也是資料的常見來源或目的地。

分别對應 InputStream,PrintStream 和 PrintStream

最常用的可能是 System.out,用于從控制台程式向控制台寫入輸出。

當 JVM 啟動時,它們由 Java 運作時環境初始化,不必自己執行個體化(盡管可以在運作時改變它們)

一個示例如下:

public class SystemToFile {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("print to console"); // 預設輸出到控制台
        // 改變 System 輸出流,從控制台到檔案
        OutputStream output = new FileOutputStream("D:\\out.txt");
        PrintStream printOut = new PrintStream(output);
        System.setOut(printOut);
        System.out.println("now print to File"); // 将輸出到檔案 D:\out.txt
    }
}
           
将流結合起來

可以将流組合成鍊,以實作更進階的輸入和輸出操作。

例如,從檔案中一次讀取一個位元組的速度很慢。 從磁盤讀取更大的資料塊然後在位元組之後疊代該塊位元組更快。

要實作緩沖,可以将 InputStream 包裝在 BufferedInputStream 中,

InputStream input = new BufferedInputStream(new FileInputStream("D:\\out.txt"));

OutputStream 同理。緩沖隻是通過組合流可以實作的效果之一。 還可以将 InputStream 包裝在 PushbackStream 中。

這樣,可以将資料推回到流中,以便稍後重新讀取。 這在解析過程中有時很友善。 或者,可以使用SequenceInputStream将兩個InputStream合并為一個。

InputStream 類是所有 Java IO 輸入流的基類。

一般直接定義 InputStream 對象,然後指向它的具體子類引用,

這樣做能夠處理所有類型的輸入流,而不僅僅是具體的子類。

OutputStream類是所有Java IO輸出流的基類。

同樣,一般直接定義 OutputStream 對象,然後指向它的具體子類引用

Reader 和 Writer

與 InputStream 和 OutputStream 非常相似,

但 Reader 和 Writer 是基于字元的。

Reader 可以與 InputStream 結合使用。 如果你有一個InputStream并想從中讀取字元,你可以将它包裝在InputStreamReader中。 将InputStream傳遞給InputStreamReader的構造函數,如下所示:

Reader reader = new InputStreamReader(inputStream);

Writer 同樣也可以:

Writer writer = new OutputStreamWriter(outputStream);

Writer 是其他所有 writer 的父類,下面是一個 Writer 的例子:

Writer writer = new FileWriter("D:\\out.txt");
writer.write("Hello Writer");`  
writer.close();
           

将 Writers 與 OutputStreams 相結合

Writer 可以像 Readers 和 InputStream 一樣與 OutputStream 結合使用。 将 OutputStream 包裝在OutputStreamWrite r中,并将寫入 Writer 的所有字元傳遞給 OutputStream 。 這是一個OutputStreamWriter示例:

Writer writer = new OutputStreamWriter(outputStream);

将Readers和Writers結合起來

就像使用流一樣,Reader 和 Writer 可以組合成鍊,以實作更有趣的 IO。 它的工作原理就像将Reader與 InputStream或者 Writer 與 OutputStream 相結合。

例如,可以通過将Reader包裝在BufferedReader或BufferedWriter中的Writer中來實作緩沖。

以下是兩個這樣的例子:

Reader reader = new BufferedReader(new FileReader(...));
Writer writer = new BufferedWriter(new FileWriter(...));
           

有時可能需要同時處理輸入和輸出。換句話說,可能需要有多個線程處理輸入并生成輸出。

例如,可能有一個需要處理磁盤上大量檔案的應用程式。 這可以與性能增益并行完成。 或者您可能有一個伺服器,如Web伺服器或聊天伺服器,它接收許多單獨的連接配接和請求。 這些也可以并行處理,結果具有一些性能增益。

接下來就跟着目錄走…