Skip to content

Latest commit

 

History

History
237 lines (196 loc) · 6.7 KB

流操作的規律.md

File metadata and controls

237 lines (196 loc) · 6.7 KB

流操作的基本規律

四個明確

  • 之所以要弄清楚規律,是因為流對象太多,開發時不知道哪個對象合適。
  • 通過四個明確知道開發時用到哪些對象。
  1. 明確數據源和數據目的(匯總) 源: InputStream Reader 目的: OutputStream Writer
  2. 明確數據是否是純文本數據 源: 是 -> Reader,否 -> InputStream 目的: 是 -> Writer,否 -> OutputStream 至此,就可以明確需求中具體要使用哪個體系。
  3. 明確具體設備 源設備: 硬盤 -> File 鍵盤 -> System.in 內存 -> 數組 網絡 -> Socket 流 目的設備: 硬盤 -> File 控制台 -> System.out 內存 -> 數組 網絡 -> Socket 流
  4. 是否需要其他額外功能 高效(緩衝區) 需要 -> 加上 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)); ```

什麼時候使用轉換流?

  • 源或者目的對應的設備是字節流,但是操作的卻是文本數據,可以使用轉換作為橋梁,提高對文本操作的便捷。
  • 一旦操作文本涉及到據的的指定編碼表時,必須使用轉換流