簡介
字符流
一、Reader
Reader 是 Java 的 IO 庫提供的另一個輸入流接口。它一個字符流,即以 char 爲單位讀取,它是所有字符輸入流的超類,它最主要的方法是:int read()
1.FileReader
FileReader 是 Reader 的一個子類,它可以打開文件並獲取 Reader。
public void readFile() throws IOException {
// 創建一個FileReader對象:
Reader reader = new FileReader("src/readme.txt", StandardCharsets.UTF_8); // 設定字符編碼是YUTF-8
for (;;) {
int n = reader.read(); // 反覆調用read()方法,直到返回-1
if (n == -1) {
break;
}
System.out.println((char)n); // 打印char
}
reader.close(); // 關閉流
}
用 try (resource)
來保證 Reader 在無論有沒有 IO 錯誤的時候都能夠正確地關閉:
try (Reader reader = new FileReader("src/readme.txt", StandardCharsets.UTF_8) {
// TODO
}
Reader 還提供了一次性讀取若干字符並填充到 char[] 數組的方法:
try (Reader reader = new FileReader("src/readme.txt", StandardCharsets.UTF_8)) {
char[] buffer = new char[1024];
int n;
while ((n = reader.read(buffer)) != -1) {
System.out.println("read " + n + " chars.");
}
}
2.StringReader
StringReader可以直接把String作爲數據源
try (Reader reader = new StringReader("Hello")) {
}
3.InputStreamReader
Reader 本質上是一個基於 InputStream 的 byte 到 char 的轉換器。如果我們已經有一個 InputStream,想把它轉換爲 Reader,是完全可行的。InputStreamReader 就是這樣一個轉換器,它可以把任何 InputStream 轉換爲Reader。
// 持有InputStream:
InputStream input = new FileInputStream("src/readme.txt");
// 變換爲Reader:
Reader reader = new InputStreamReader(input, "UTF-8");
簡潔的寫法:
try (Reader reader = new InputStreamReader(new FileInputStream("src/readme.txt"), "UTF-8")) {
// TODO:
}
二、Writer
Writer 是帶編碼轉換器的 OutputStream,它把 char 轉換爲 byte 並輸出。Writer 是所有字符輸出流的超類,它提供的方法主要有:
- 寫入一個字符(0~65535): void write(int c);
- 寫入字符數組的所有字符: void write(char[] c);
- 寫入String表示的所有字符: void write(String s)。
1.FileWriter
FileWriter 就是向文件中寫入字符流的 Writer。它的使用方法和 FileReader 類似:
try (Writer writer = new FileWriter("readme.txt", StandardCharsets.UTF_8)) {
writer.write('H'); // 寫入單個字符
writer.write("Hello".toCharArray()); // 寫入char[]
writer.write("Hello"); // 寫入String
}
2.OutputStreamWriter
普通的 Writer 實際上是基於 OutputStream 構造的,它接收 char,然後在內部自動轉換成一個或多個 byte,並寫入 OutputStream。因此,OutputStreamWriter 就是一個將任意的 OutputStream 轉換爲 Writer 的轉換器:
try (Writer writer = new OutputStreamWriter(new FileOutputStream("readme.txt"), "UTF-8")) {
// TODO:
}
三、PrintStream和PrintWriter
1.PrintStream
PrintStream 是一種 FilterOutputStream,它在 OutputStream 的接口上,額外提供了一些寫入各種數據類型的方法:
- 寫入int: print(int)
- 寫入boolean: print(boolean)
- 寫入String: print(String)
- 寫入Object: print(Object),實際上相當於print(object.toString())
2.PrintWriter
PrintStream 最終輸出的總是 byte 數據,而 PrintWriter 則是擴展了 Writer 接口,它的 print()/println()
方法最終輸出的是 char 數據
StringWriter buffer = new StringWriter();
try (PrintWriter pw = new PrintWriter(buffer)) {
pw.println("Hello");
pw.println(12345);
pw.println(true);
}
System.out.println(buffer.toString());