字符流---IO学习笔记(三)
字符流:
文本和文本文件的區(qū)別:
文本:
java的文本(char)是16位無(wú)符號(hào)整數(shù),是字符的unicode編碼(雙字節(jié)編碼)。
文件:
文件是byte byte byte…的數(shù)據(jù)序列。
文本文件:
文本文件是文本(char)序列按照某種編碼方案(utf-8,utf-16be,gbk)序列化為byte的存儲(chǔ)結(jié)果。
字符流(Reader,Writer)
操作的是文本文件。對(duì)于mp3,二進(jìn)制文件是字節(jié)文件不適合用字符流讀取,因?yàn)樽x取出來(lái)的是char,沒有意義。
字符的處理,一次處理一個(gè)字符
字符的底層仍然是基本的字節(jié)序列
字符流(字節(jié)字符轉(zhuǎn)換流)的基本實(shí)現(xiàn):
InputStreamReader:
完成byte流解析為char流,按照編碼解析
OutputStreamWriter:
提供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\\讀取的測(cè)試文件.txt";ReadFile1(filename);ReadFile2(filename);} catch (Exception e) {e.printStackTrace();}}/*** 單字符讀取* 返回的是讀到字節(jié)轉(zhuǎn)換成int類型(最后8位)的值* @param fis*/public static void ReadFile1(String filename) throws IOException{System.out.println("單字節(jié)讀取的方式:");InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//默認(rèn)的是項(xiàng)目的編碼(這里是gbk) // InputStreamReader isr = new InputStreamReader(fis, "gbk");int i;while((i = isr.read())!=-1){System.out.print((char)i);}isr.close();}/*** 批量讀取* 放入buf這個(gè)字符數(shù)組中,從第0個(gè)位置開始放置,最多放buf.length個(gè)* 返回的是讀到字符的個(gè)數(shù)* @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));//默認(rèn)的是項(xiàng)目的編碼(這里是gbk)char[] buf = new char[2*1024];int i;while((i = isr.read(buf, 0, buf.length))!=-1){ // //第一種轉(zhuǎn)換成字符的方式 // for(int j = 0;j<i;j++){ // System.out.print((char)buf[j]); // }//第二種轉(zhuǎn)換成字符串的方式String str = new String(buf,0,i);System.out.println(str);}isr.close();}}結(jié)果截圖:
注意:在操作字符流的時(shí)候要注意編碼的問題。這里讀取的文件是gbk編碼格式的,所以在讀取的時(shí)候要采用gbk編碼的讀取方式。否則就會(huì)出現(xiàn)亂碼。
FileWriter和FileReader:
其實(shí)上邊的代碼中的:
InputStreamReader isr = new InputStreamReader(new FileInputStream(String filename));
這部分代碼完全可以使用
FileReader fr = new FileReader(String filename);
來(lái)替代。
FileReader和FileWriter的基本方法的使用:
注意:FileReader和FileWriter與之前的代碼中通過InputStreamReader包裝FileInputStream相比,雖然簡(jiǎn)潔,但是不能設(shè)置采用什么編碼讀取文件,只能使用項(xiàng)目默認(rèn)的編碼讀取文件。
字符流的過濾器:
BufferedReader——>readLine 一次讀一行
BufferedWriter/PrintWriter———>寫一行
上邊這兩種寫出文件的方法的效果是一樣的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的字符流---IO学习笔记(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字节流--IO学习笔记(二)
- 下一篇: 对象的序列化与反序列化---IO学习笔记