IO流(三)

簡介

字符流

一、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());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章