1. 程式人生 > >java 字元流 介紹

java 字元流 介紹

字元流FileReader

我們之前介紹過位元組流,這裡我們介紹字元流

  • 字元流是什麼
    • 字元流是可以直接讀寫字元的IO流
    • 字元流讀取字元, 就要先讀取到位元組資料, 然後轉為字元. 如果要寫出字元, 需要把字元轉為位元組再寫出.
/* FileReader
	* FileReader類的read()方法可以按照字元大小讀取*/
 
		FileReader fr = new FileReader("aaa.txt");			
			//建立輸入流物件,關聯aaa.txt
		int ch;
		while((ch = fr.
read()) != -1) { //將讀到的字元賦值給ch System.out.println((char)ch); //將讀到的字元強轉後列印 } fr.close(); //關流
字元流FileWriter
  • FileWriter類的write()方法可以自動把字元轉為位元組寫出
    FileWriter fw = new FileWriter(“aaa.txt”);
    fw.write(“aaa”);
    fw.close();
字元流的拷貝
FileReader fr = new FileReader
("a.txt"); FileWriter fw = new FileWriter("b.txt"); int ch; while((ch = fr.read()) != -1) { fw.write(ch); } fr.close(); fw.close();
什麼情況下使用字元流
  • 字元流也可以拷貝文字檔案, 但不推薦使用. 因為讀取時會把位元組轉為字元, 寫出時還要把字元轉回位元組.

  • 程式需要讀取一段文字, 或者需要寫出一段文字的時候可以使用字元流

  • 讀取的時候是按照字元的大小讀取的,不會出現半個中文

  • 寫出的時候可以直接將字串寫出,不用轉換為位元組陣列

  • 不可以拷貝非純文字的檔案

  • 因為在讀的時候會將位元組轉換為字元,在轉換過程中,可能找不到對應的字元,就會用?代替,寫出的時候會將字元轉換成位元組寫出去

  • 如果是?,直接寫出,這樣寫出之後的檔案就亂了,看不了了

自定義字元陣列的拷貝
	FileReader fr = new FileReader("aaa.txt");			
	//建立字元輸入流,關聯aaa.txt
		FileWriter fw = new FileWriter("bbb.txt");			
		//建立字元輸出流,關聯bbb.txt
		
		int len;
		char[] arr = new char[1024*8];						//建立字元陣列
		while((len = fr.read(arr)) != -1) {				
			//將資料讀到字元陣列中
			fw.write(arr, 0, len);							
			//從字元陣列將資料寫到檔案上
		}
		
		fr.close();											//關流釋放資源
		fw.close();	
帶緩衝的字元流
  • BufferedReader的read()方法讀取字元時會一次讀取若干字元到緩衝區, 然後逐個返回給程式, 降低讀取檔案的次數, 提高效率
  • BufferedWriter的write()方法寫出字元時會先寫到緩衝區, 緩衝區寫滿時才會寫到檔案, 降低寫檔案的次數, 提高效率
BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
	//建立字元輸入流物件,關聯aaa.txt
		BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));	
		//建立字元輸出流物件,關聯bbb.txt
		
		int ch;				
		while((ch = br.read()) != -1) {		
		//read一次,會先將緩衝區讀滿,從緩衝去中一個一個的返給臨時變數ch
			bw.write(ch);					
			//write一次,是將資料裝到字元陣列,裝滿後再一起寫出去
		}
		
		br.close();							//關流
		bw.close();  

###21.08_IO流(readLine()和newLine()方法)

/*BufferedReader的readLine()方法可以讀取一行字元(不包含換行符號)
BufferedWriter的newLine()可以輸出一個跨平臺的換行符號"\r\n"*/
		BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
		String line;
		while((line = br.readLine()) != null) {
			bw.write(line);
			//bw.write("\r\n");					//只支援windows系統
			bw.newLine();						//跨平臺的
		}
		
		br.close();
		bw.close(); 

LineNumberReader
  • LineNumberReader是BufferedReader的子類, 具有相同的功能, 並且可以統計行號
    • 呼叫getLineNumber()方法可以獲取當前行號
    • 呼叫setLineNumber()方法可以設定當前行號
		LineNumberReader lnr = new LineNumberReader(new FileReader("aaa.txt"));
		String line;
		lnr.setLineNumber(100);									
		//設定行號
		while((line = lnr.readLine()) != null) {
			System.out.println(lnr.getLineNumber() + ":" + line);//獲取行號
		}
		
		lnr.close(); 
裝飾設計模式
		interface Coder {
			public void code();
		}
		
		class Student implements Coder {
		
			@Override
			public void code() {
				System.out.println("javase");
				System.out.println("javaweb");
			}
			
		}
		
		class HeiMaStudent implements Coder {
			private Student s;						
			//獲取到被包裝的類的引用
			public HeiMaStudent(Student s) {		
			//通過建構函式建立物件的時候,傳入被包裝的物件
				this.s = s;
			}
			@Override
			public void code() {					
			//對其原有功能進行升級
				s.code();
				System.out.println("資料庫");
				System.out.println("ssh");
				System.out.println("安卓");
				System.out.println(".....");
			}
			
		} 
使用指定的碼錶讀寫字元
  • FileReader是使用預設碼錶讀取檔案, 如果需要使用指定碼錶讀取, 那麼可以使用InputStreamReader(位元組流,編碼表)
  • FileWriter是使用預設碼錶寫出檔案, 如果需要使用指定碼錶寫出, 那麼可以使用OutputStreamWriter(位元組流,編碼表)
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));									
		//高效的用指定的編碼表讀
		BufferedWriter bw = 	new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));
		//高效的用指定的編碼表寫
		int ch;
		while((ch = br.read()) != -1) {
			bw.write(ch);
		}
		
		br.close();
		bw.close();