- 之所以要弄清楚規律,是因為流對象太多,開發時不知道哪個對象合適。
- 通過四個明確知道開發時用到哪些對象。
- 明確數據源和數據目的(匯總) 源: InputStream Reader 目的: OutputStream Writer
- 明確數據是否是純文本數據 源: 是 -> Reader,否 -> InputStream 目的: 是 -> Writer,否 -> OutputStream 至此,就可以明確需求中具體要使用哪個體系。
- 明確具體設備 源設備: 硬盤 -> File 鍵盤 -> System.in 內存 -> 數組 網絡 -> Socket 流 目的設備: 硬盤 -> File 控制台 -> System.out 內存 -> 數組 網絡 -> Socket 流
- 是否需要其他額外功能 高效(緩衝區) 需要 -> 加上 Buffer
- 需求: 複製一個文本文件 明確源和目的 源: InputStream Reader 目的: OutputStream Writer 是否是純文本 是 -> 源: Reader,目的: Writer 明確具體設備 源: 硬盤 -> File 目的: 硬盤 -> File
FileReader fr = new FileReader("a.txt");
FileWrider fw = new FileWriter("b.txt");
需不需要額外功能 需要,需要高效
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt));
- 需求: 讀取鍵盤錄入信息,並寫入一個文件中。 明確源和目的 源: InputStream Reader 目的: OutputStream Writer 是否是純文本 是 -> 源: Reader,目的: Writer 明確具體設備 源: 鍵盤 -> System.in 目的: 硬盤 -> File
InputStream in = System.in;
FileWriter fw = new FileWriter("b.txt);
//這樣做可以完成,但是麻煩。將讀取的字節數據轉換成字符串,再由字符流操作
需不需要額外功能 需要: 轉換。 將字節流轉成字符流。因為明確的源是 Reader,這樣操作文本數據更便捷。 所以要將已有的字節流轉成字符流。使用字節 -> 字符。InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter("b.txt");
需要: 高效。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
-
需求: 將一個文本文件數據顯示在控制台上。 明確源和目的 源: InputStream Reader 目的: OutputStream Writer 是否是純文本 是 -> 源: Reader,目的: Writer 明確具體設備 源: 硬盤 -> File 目的: 控制台 -> System.out
FileReader fr = new FileReader("a.txt"); OutputStream out = System.out;//PrintStream
**需不需要額外功能**
需要: 轉換
```java
FileReader fr = new FileReader("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(System.out);
需要: 高效
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = nwe BufferedWriter(new OutputStreamWriter(System.out));
- 需求: 讀取鍵盤錄入數據,顯示在控制台上。 明確源和目的 源: InputStream Reader 目的: OutputStream Writer 是否是純文本 是 -> 源: Reader,目的: Writer 明確具體設備 源: 鍵盤 -> System.out 目的: 控制台 -> System.out
InputStream in = System.in;
OutputStream out = System.out;
明確額外功能 需要: 轉換 因為都是字節流,但是操作的卻是文本數具。 所以使用字符流操作起來更為便捷。
InputStreamReader isr = new InputStreamReader(System.in);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
需要: 高效
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
- 將一個中文字符串數據按照指定的編碼表寫入到一個文本文件中 目的 OutputStream,Writer 純文本 Writer 設備 硬盤File
FileWriter fw = new FileWriter("a.txt");
fw.write("你好");
Example
public static void main(String[] args) throws IOException {
writeText_1();
writeText_2();
readText_1();
readText_2();
}
public static void readText_1() throws IOException {
FileReader fr = new FileReader("gbk_1.txt");
char[] buf = new char[10];
int len = fr.read(buf);
String str = new String(buf, 0, len);
System.out.println(str);
fr.close();
}
public static void writeText_1() throws IOException {
FileWriter fw = new FileWriter("gbk_1.txt");
fw.write("你好");
fw.flush();
fw.close();
}
public static void readText_2() throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk_1.txt"), "UTF-8");//會出現亂碼
char[] buf = new char[10];
int len = isr.read(buf);
String str = new String(buf, 0, len);
System.out.println(str);
isr.close();
}
public static void writeText_2() throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk_2.txt"), "UTF-8");//使用 UTF-8 編碼表
// FileWriter fw = new FileWriter("gbk_1.txt");
/*
* 這兩句功能是相同的,
*
* FileWriter: 其實就是轉換流指定了本機默認編碼表的表現,而這個轉換流的子類對象,可以方便操作文本文件。
* 簡單來講,操作文件的字節流 + 本機默認的編碼表。
* 這是按照默認編碼表來操作的便捷類。
*
* 如果操作文本文件需要明確指定的編碼表,就不能用 FileWriter,必須用轉換流。
*/
osw.write("你好");
osw.close();
}
}
**打印結果**
```
你好
?A?n
```
**注意:** 既然需求中已經明確了指定編碼表的動作。
哪就不可以使用 FileWriter,因為 FileWriter 內部是使用默認的本地碼表。
只能使用其父類 OutputStreamWriter,
OutputStreamWriter 接收一個字節輸出流對象,既然是操作文件,那麼該對象應該是 FileOutputStream
```
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"), charsetName);
**需要高效**
java
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"), charsetName));
```
- 源或者目的對應的設備是字節流,但是操作的卻是文本數據,可以使用轉換作為橋梁,提高對文本操作的便捷。
- 一旦操作文本涉及到據的的指定編碼表時,必須使用轉換流。