一,字符流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類的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();
- 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是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())