Java IO 類的系統(tǒng)教程,原創(chuàng)。主要參考自英文教程 Java IO Tutorial 和 Java Doc。
http://tutorials.jenkov.com/java-io/index.html
目的: 掌握 Java IO 幾乎所有類的基礎(chǔ)用法,完全知道什么時(shí)候應(yīng)該使用什么類。
分開學(xué)習(xí),先系統(tǒng)學(xué)習(xí) IO 所有的類,再另外學(xué)習(xí) NIO 。
目錄:
- 系統(tǒng)學(xué)習(xí) Java IO (一)----輸入流和輸出流 InputStream/OutputStream
- 系統(tǒng)學(xué)習(xí) Java IO (二)----IO 異常處理
- 系統(tǒng)學(xué)習(xí) Java IO (三)----文件類 File
- 系統(tǒng)學(xué)習(xí) Java IO (四)----文件處理流和隨機(jī)訪問(wèn) FileInputStream/FileOutputStream & RandomAccessFile
- 系統(tǒng)學(xué)習(xí) Java IO (五)----使用 SequenceInputStream 組合多個(gè)流
- 系統(tǒng)學(xué)習(xí) Java IO (六)----管道流 PipedInputStream/PipedOutputStream
- 系統(tǒng)學(xué)習(xí) Java IO (七)----字節(jié)數(shù)組流 ByteArrayInputStream/ByteArrayOutputStream
- 系統(tǒng)學(xué)習(xí) Java IO (八)----裝飾流 FilterInputStream/FilterOutputStream
- 系統(tǒng)學(xué)習(xí) Java IO (九)----緩沖流 BufferedInputStream/BufferedOutputStream
- 系統(tǒng)學(xué)習(xí) Java IO (十)----回退流 PushbackInputStream
- 系統(tǒng)學(xué)習(xí) Java IO (十一)----打印流 PrintStream
- 系統(tǒng)學(xué)習(xí) Java IO (十二)----數(shù)據(jù)流和對(duì)象流
- 系統(tǒng)學(xué)習(xí) Java IO (十三)----字符讀寫 Reader/Writer 及其常用子類
- 系統(tǒng)學(xué)習(xí) Java IO (十四)----字符讀寫緩存和回退 BufferedReader/BufferedWriter & PushbackReader
- 系統(tǒng)學(xué)習(xí) Java IO (十五)----字符讀寫 Reader/Writer 其他子類
- 系統(tǒng)學(xué)習(xí) Java IO (十六)----這么多類,應(yīng)該用哪個(gè)?
先放一張 IO 類圖,看著有點(diǎn)多(本教程還包含了一些不在這圖里的),不要怕,跟著 Jenkov 大神走,一個(gè)一個(gè)來(lái),都能掌握的。

部分內(nèi)容概覽
Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標(biāo)。
System.in, System.out 和 System.err 這三個(gè)流也是數(shù)據(jù)的常見來(lái)源或目的地。
分別對(duì)應(yīng) InputStream,PrintStream 和 PrintStream
最常用的可能是 System.out,用于從控制臺(tái)程序向控制臺(tái)寫入輸出。
當(dāng) JVM 啟動(dòng)時(shí),它們由 Java 運(yùn)行時(shí)環(huán)境初始化,不必自己實(shí)例化(盡管可以在運(yùn)行時(shí)改變它們)
一個(gè)示例如下:
public class SystemToFile {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("print to console"); // 默認(rèn)輸出到控制臺(tái)
// 改變 System 輸出流,從控制臺(tái)到文件
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
}
}
將流結(jié)合起來(lái)
可以將流組合成鏈,以實(shí)現(xiàn)更高級(jí)的輸入和輸出操作。
例如,從文件中一次讀取一個(gè)字節(jié)的速度很慢。 從磁盤讀取更大的數(shù)據(jù)塊然后在字節(jié)之后迭代該塊字節(jié)更快。
要實(shí)現(xiàn)緩沖,可以將 InputStream 包裝在 BufferedInputStream 中,
InputStream input = new BufferedInputStream(new FileInputStream("D:\\out.txt"));
OutputStream 同理。緩沖只是通過(guò)組合流可以實(shí)現(xiàn)的效果之一。 還可以將 InputStream 包裝在 PushbackStream 中。
這樣,可以將數(shù)據(jù)推回到流中,以便稍后重新讀取。 這在解析過(guò)程中有時(shí)很方便。 或者,可以使用SequenceInputStream將兩個(gè)InputStream合并為一個(gè)。
InputStream 類是所有 Java IO 輸入流的基類。
一般直接定義 InputStream 對(duì)象,然后指向它的具體子類引用,
這樣做能夠處理所有類型的輸入流,而不僅僅是具體的子類。
OutputStream類是所有Java IO輸出流的基類。
同樣,一般直接定義 OutputStream 對(duì)象,然后指向它的具體子類引用
Reader 和 Writer
與 InputStream 和 OutputStream 非常相似,
但 Reader 和 Writer 是基于字符的。
Reader 可以與 InputStream 結(jié)合使用。 如果你有一個(gè)InputStream并想從中讀取字符,你可以將它包裝在InputStreamReader中。 將InputStream傳遞給InputStreamReader的構(gòu)造函數(shù),如下所示:
Reader reader = new InputStreamReader(inputStream);
Writer 同樣也可以:
Writer writer = new OutputStreamWriter(outputStream);
Writer 是其他所有 writer 的父類,下面是一個(gè) Writer 的例子:
Writer writer = new FileWriter("D:\\out.txt");
writer.write("Hello Writer");`
writer.close();
將 Writers 與 OutputStreams 相結(jié)合
Writer 可以像 Readers 和 InputStream 一樣與 OutputStream 結(jié)合使用。 將 OutputStream 包裝在OutputStreamWrite r中,并將寫入 Writer 的所有字符傳遞給 OutputStream 。 這是一個(gè)OutputStreamWriter示例:
Writer writer = new OutputStreamWriter(outputStream);
將Readers和Writers結(jié)合起來(lái)
就像使用流一樣,Reader 和 Writer 可以組合成鏈,以實(shí)現(xiàn)更有趣的 IO。 它的工作原理就像將Reader與 InputStream或者 Writer 與 OutputStream 相結(jié)合。
例如,可以通過(guò)將Reader包裝在BufferedReader或BufferedWriter中的Writer中來(lái)實(shí)現(xiàn)緩沖。
以下是兩個(gè)這樣的例子:
Reader reader = new BufferedReader(new FileReader(...));
Writer writer = new BufferedWriter(new FileWriter(...));
有時(shí)可能需要同時(shí)處理輸入和輸出。換句話說(shuō),可能需要有多個(gè)線程處理輸入并生成輸出。
例如,可能有一個(gè)需要處理磁盤上大量文件的應(yīng)用程序。 這可以與性能增益并行完成。 或者您可能有一個(gè)服務(wù)器,如Web服務(wù)器或聊天服務(wù)器,它接收許多單獨(dú)的連接和請(qǐng)求。 這些也可以并行處理,結(jié)果具有一些性能增益。
接下來(lái)就跟著目錄走...