標籤:java 字元流
字元流:
文本和文字檔的區別:
文本:
java的文本(char)是16位不帶正負號的整數,是字元的unicode編碼(雙位元組編碼)。
檔案:
檔案是byte byte byte…的資料序列。
文字檔:
文字檔是文本(char)序列按照某種編碼方案(utf-8,utf-16be,gbk)序列化為byte的儲存結果。
字元流(Reader,Writer)
操作的是文字檔。對於mp3,二進位檔案是位元組檔案不適合用字元流讀取,因為讀取出來的是char,沒有意義。
字元的處理,一次處理一個字元
字元的底層仍然是基本的位元組序列
字元流(位元組字元轉換流)的基本實現:
InputStreamReader:
完成byte流解析為char流,按照編碼解析
OutStreamWriter:
提供char流到byte流,按照編碼處理
字元流的基本方法的使用:
package com.test.FileInputStreamReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;public class FileInputStreamReaderTest { public static void main(String[] args){ try { String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\讀取的測試檔案.txt"; ReadFile1(filename); ReadFile2(filename); } catch (Exception e) { e.printStackTrace(); } } /** * 單字元讀取 * 返回的是讀到位元組轉換成int類型(最後8位)的值 * @param fis */ public static void ReadFile1(String filename) throws IOException{ System.out.println("單位元組讀取的方式:"); InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//預設的是項目的編碼(這裡是gbk)// InputStreamReader isr = new InputStreamReader(fis, "gbk"); int i; while((i = isr.read())!=-1){ System.out.print((char)i); } isr.close(); } /** * 批量讀取 * 放入buf這個字元數組中,從第0個位置開始放置,最多放buf.length個 * 返回的是讀到字元的個數 * @param fis * @throws IOException */ public static void ReadFile2(String filename) throws IOException{ System.out.println(); System.out.println("批量讀取的方式:"); InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//預設的是項目的編碼(這裡是gbk) char[] buf = new char[2*1024]; int i; while((i = isr.read(buf, 0, buf.length))!=-1){// //第一種轉換成字元的方式// for(int j = 0;j<i;j++){// System.out.print((char)buf[j]);// } //第二種轉換成字串的方式 String str = new String(buf,0,i); System.out.println(str); } isr.close(); }}
結果:
注意:在操作字元流的時候要注意編碼的問題。這裡讀取的檔案是gbk編碼格式的,所以在讀取的時候要採用gbk編碼的讀取方式。否則就會出現亂碼。
FileWriter和FileReader:
其實上邊的代碼中的:
InputStreamReader isr = new InputStreamReader(new FileInputStream(String filename));
這部分代碼完全可以使用
FileReader fr = new FileReader(String filename);
來替代。
FileReader和FileWriter的基本方法的使用:
package com.test.FileReaderAndFileWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class FileReaderAndFileWriterTest{ public static void main(String[] args) throws IOException{ FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\javaIO\\讀取的測試檔案.txt");//缺點:不過這裡只能識別項目預設的編碼不能設定其他的編碼,如果讀取的檔案編碼不是項目預設的編碼,讀取時就會出現亂碼 FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\寫出的測試檔案.txt"); char[] buf = new char[2*1024]; int i; while((i = fr.read(buf, 0, buf.length))!=-1){ fw.write(buf, 0, i); fw.flush(); } fr.close(); fw.close(); }}
注意:FileReader和FileWriter與之前的代碼中通過InputStreamReader封裝FileInputStream相比,雖然簡潔,但是不能設定採用什麼編碼讀取檔案,只能使用項目預設的編碼讀取檔案。
字元流的過濾器:
BufferedReader——>readLine 一次讀一行
BufferedWriter/PrintWriter———>寫一行
package com.test.BufferedReaderAndBufferedWriter;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;public class BufferedReaderTest { public static void main(String[] args){ String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\讀取的測試檔案.txt"; try { BufferedWriter(filename); PrintWriter(filename); } catch (IOException e) { e.printStackTrace(); } } /** * 使用BufferedWriter寫出 * @throws IOException */ public static void BufferedWriter(String filename) throws IOException{ BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream( filename))); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\javaIO\\測試檔案1.txt"))); String line; while((line = br.readLine())!=null){//但是這裡的readLine並不識別分行符號 System.out.println(line);// bw.write(line);//寫出的檔案內容沒有進行換行// bw.write(line+"\r\n");//這裡再寫出檔案的時候要單獨寫出換行操作 bw.write(line); bw.newLine();//換行操作 bw.flush(); } br.close(); bw.close(); } /** * 使用PrintWriter寫出 * @param filename * @throws IOException */ public static void PrintWriter(String filename) throws IOException{ BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream( filename))); PrintWriter pw = new java.io.PrintWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\測試檔案2.txt"); String line; while((line = br.readLine())!=null){ pw.println(line); pw.flush(); } br.close(); pw.close(); }}
上邊這兩種寫出檔案的方法的效果是一樣的。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java中字元流的知識點---IO學習筆記(三)