java中IO字符流

字符流FileReader
* 1.字符流是什麼
    * 字符流是可以直接讀寫字符的IO流
    * 字符流讀取字符, 就要先讀取到字節數據, 然後轉爲字符. 如果要寫出字符, 需要把字符轉爲字節再寫出.    
* 2.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();


什麼情況下使用字符流
* 字符流也可以拷貝文本文件, 但不推薦使用. 因爲讀取時會把字節轉爲字符, 寫出時還要把字符轉回字節.
* 程序需要讀取一段文本, 或者需要寫出一段文本的時候可以使用字符流
* 讀取的時候是按照字符的大小讀取的,不會出現半個中文
* 寫出的時候可以直接將字符串寫出,不用轉換爲字節數組

字符流是否可以拷貝非純文本的文件
* 不可以拷貝非純文本的文件
* 因爲在讀的時候會將字節轉換爲字符,在轉換過程中,可能找不到對應的字符,就會用?代替,寫出的時候會將字符轉換成字節寫出去
* 如果是?,直接寫出,這樣寫出之後的文件就亂了,看不了了  

IO流(自定義字符數組的拷貝)
*    
        
        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();    

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo3_Copy {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//demo1();
		//demo2();	
		//demo3();
		BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
		
		int c;
		while((c = br.read()) != -1) {
			bw.write(c);
		}
		
		br.close();
		bw.close();
	}

	public static void demo3() throws FileNotFoundException, IOException {
		FileReader fr = new FileReader("xxx.txt");
		FileWriter fw = new FileWriter("yyy.txt");
		
		char[] arr = new char[1024];
		int len;
		while((len = fr.read(arr)) != -1) {			//將文件上的數據讀取到字符數組中
			fw.write(arr,0,len);					//將字符數組中的數據寫到文件上
		}
		
		fr.close();
		fw.close();
	}

	public static void demo2() throws FileNotFoundException, IOException {
		//字符流不能拷貝純文本的文件
		FileReader fr = new FileReader("雙元.jpg");
		FileWriter fw = new FileWriter("copy.jpg");
		
		int c;
		while((c = fr.read()) != -1) {
			fw.write(c);
		}
		
		fr.close();
		fw.close();
	}

	public static void demo1() throws FileNotFoundException, IOException {
		FileReader fr = new FileReader("xxx.txt");
		FileWriter fw = new FileWriter("zzz.txt");
		
		int c;
		while((c = fr.read()) != -1) {
			fw.write(c);
		}
		
		fr.close();
		fw.close();				//Writer類中有一個2k的小緩衝區,如果不關流,就會將內容寫到緩衝區裏,關流會將緩衝區內容刷新,再關閉
	}

}

IO流(帶緩衝的字符流) 
* 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的write()是寫入一行
* 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(); 

public class Demo4_Buffered {

	/**
	 * @param args
	 * 帶緩衝區的流中的特殊方法
	 * readLine()
	 * newLine();
	 * 
	 * newLine()與\r\n的區別
	 * newLine()是跨平臺的方法
	 * \r\n只支持的是windows系統
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//demo1();
		BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));
		
		String line;
		while((line = br.readLine()) != null) {
			bw.write(line);
			//bw.newLine();							//寫出回車換行符
			//bw.write("\r\n");
		}
		
		br.close();
		bw.close();
	}

	public static void demo1() throws FileNotFoundException, IOException {
		BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
		String line;
		
		while((line = br.readLine()) != null) {
			System.out.println(line);
		}
		
		br.close();
	}

}

例題

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class Test1 {

	/**
	 * @param args
	 * 將一個文本文檔上的文本反轉,第一行和倒數第一行交換,第二行和倒數第二行交換
	 * 
	 * 分析:
	 * 1,創建輸入輸出流對象
	 * 2,創建集合對象
	 * 3,將讀到的數據存儲在集合中
	 * 4,倒着遍歷集合將數據寫到文件上
	 * 5,關流
	 * @throws IOException 
	 * 
	 * 注意事項:
	 * 流對象儘量晚開早關
	 */
	public static void main(String[] args) throws IOException {
		//改寫後是儘量晚開早關
		// 1,創建輸入輸出流對象
		BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
		
		//2,創建集合對象
		ArrayList<String> list = new ArrayList<>();
		//3,將讀到的數據存儲在集合中
		String line;
		while((line = br.readLine()) != null) {
			list.add(line);
		}
		
		
		//4,倒着遍歷集合將數據寫到文件上
		BufferedWriter bw = new BufferedWriter(new FileWriter("revzzz.txt"));
		for(int i = list.size() - 1; i >= 0; i--) {
			bw.write(list.get(i));
			bw.newLine();
		}
		//5,關流
		br.close();	
		bw.close();
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章