java 字元流 介紹
阿新 • • 發佈:2018-12-03
字元流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();