Java基礎——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();

四,什麼情況下使用字符流
  • 字符流也可以拷貝文本文件, 但不推薦使用. 因爲讀取時會把字節轉爲字符, 寫出時還要把字符轉回字節.
  • 程序需要讀取一段文本, 或者需要寫出一段文本的時候可以使用字符流
  • 讀取的時候是按照字符的大小讀取的,不會出現半個中文
  • 寫出的時候可以直接將字符串寫出,不用轉換爲字節數組
五,字符流是否可以拷貝非純文本的文件
  • 不可以拷貝非純文本的文件
  • 因爲在讀的時候會將字節轉換爲字符,在轉換過程中,可能找不到對應的字符,就會用?代替,寫出的時候會將字符轉換成字節寫出去
  • 如果是?,直接寫出,這樣寫出之後的文件就亂了,看不了了
六,自定義字符數組的拷貝
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();

八,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(); 

九,將文本反轉
  • 將一個文本文檔上的文本反轉,第一行和倒數第一行交換,第二行和倒數第二行交換
  •                 ArrayList<String> al = new ArrayList<>();
    		FileReader fr = new FileReader("E:\\2015最新JAVA視頻\\day21\\筆記+作業\\day21作業.java");
    		BufferedReader br = new BufferedReader(fr);
    		String s =null;
    		while((s=br.readLine())!=null){
    		al.add(s);
    		}
    		br.close();
    		Collections.reverse(al);
    		BufferedWriter bw = new BufferedWriter(new FileWriter("text123.txt"));
    		Iterator<String> it = al.iterator();
    		while(it.hasNext()){
    			bw.write(it.next());
    			bw.newLine();
    		}
    		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();
    

十三,轉換流圖解
  • 畫圖分析轉換流
十四,獲取文本上字符出現的次數
  • 獲取一個文本上每個字符出現的次數,將結果寫在times.txt上
  •                 FileReader fr = new FileReader("aaa.txt");
    		LinkedHashMap<Character, Integer> lhm = new LinkedHashMap<>();
    		int i;
    		while ((i = fr.read()) != -1) {
    			char c = (char) i;
    			lhm.put(c, (lhm.containsKey(c) ? (lhm.get(c) + 1) : 1));
    		}
    		fr.close();
    		Set<Map.Entry<Character, Integer>> me = lhm.entrySet();
    		FileWriter fw = new FileWriter("times.txt");
    		for (Entry<Character, Integer> e : me) {
    			if(' '==e.getKey()){
    				fw.write("空格" + ":" + e.getValue());
    				fw.write("\r\n");
    			}else if('\r'==e.getKey()){
    				continue;
    			}else if('\n'==e.getKey()){
    				fw.write("換行" + ":" + e.getValue());
    				fw.write("\r\n");
    			}else if('\t'==e.getKey()){
    				fw.write("製表符" + ":" + e.getValue());
    				fw.write("\r\n");
    			}else{
    				fw.write(e.getKey() + ":" + e.getValue());
    				fw.write("\r\n");
    			}
    				
    		}
    		fw.close();

十五,試用版軟件
  • 當我們下載一個試用版軟件,沒有購買正版的時候,每執行一次就會提醒我們還有多少次使用機會用學過的IO流知識,模擬試用版軟件,試用10次機會,執行一次就提示一次您還有幾次機會,如果次數到了提示請購買正版
  • import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    /*
     *當我們下載一個試用版軟件,沒有購買正版的時候,每執行一次就會提醒我們還有多少次
     *使用機會用學過的IO流知識,模擬試用版軟件,試用10次機會,執行一次就提示一次您還有幾次機會,
     *如果次數到了提示請購買正版
     *
     * 分析:
     * 1.config文件,記錄次數,執行一次,就減一次,寫進去,
     */
    public class Test9 {
    	public static void main(String[] args) throws IOException {
    		FileReader fr = new FileReader("times123.txt");
    		BufferedReader br = new BufferedReader(fr);
    		int i =Integer.parseInt(br.readLine()) ;
    		fr.close();
    		i--;
    		if (i == 1)
    			System.out.println("您的試用次數已到,請購買正版軟件!");
    		else
    			System.out.println("您還有" + i + "次機會!");
    		FileWriter fw = new FileWriter("times123.txt");
    		fw.write(i+"");
    		fw.close();
    	}
    
    }

十六,總結
  • 1.會用BufferedReader讀取GBK碼錶和UTF-8碼錶的字符(使用InputStreamReader(字節流,編碼表))
  • 2.會用BufferedWriter寫出字符到GBK碼錶和UTF-8碼錶的文件中(使用OutputStreamWriter(字節流,編碼表))
  • 3.會使用BufferedReader從鍵盤讀取一行(readLine())

發佈了46 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章