1掂铐、FileReader
????????同F(xiàn)ileInputStream品擎,單位不同埋合。
讀取:
????????read()-->int萄传,讀取一個字符甚颂,返回值就是讀到的數(shù)據(jù),末尾-1.
????????read(char[] cs)-->int秀菱,讀取多個字符振诬,存入cs字符數(shù)組中,返回值讀取的個數(shù)衍菱。末尾-1
????????read(char[] cs,int off,int len)-->int赶么,讀取多個字符,末尾-1
字節(jié)流:操作的單位是字節(jié)脊串,可以讀取一個字節(jié)辫呻,也可以讀取多個字節(jié),存入字節(jié)數(shù)組:byte[] bs琼锋,
字符流:操作的單位是字符放闺,可以讀取一個字符,也可以讀取多個字符缕坎,存入字符數(shù)組:char[] cs怖侦,
?
選擇流的時候,到低是選擇字節(jié)為單位的還是字符單位的谜叹?
數(shù)據(jù):計算機存儲數(shù)據(jù)匾寝,都是采用2進制:01碼
單位:
????????一個0或一個1,叫一個bit叉谜,位
????????8個0或1旗吁,叫一個byte,字節(jié)
????????所有的數(shù)據(jù)的本質(zhì)停局,都是字節(jié)為單位的很钓。
????????圖片,音頻董栽,視頻码倦,壓縮文件,exe可執(zhí)行文件锭碳,包括文本文件袁稽。。
????????字符流:字符——>字符編碼(GBK,UTF-8)
????????a:97
????????中:20013
【禁止】G芘住M破补疑!使用字符流去操作非字符的文件。比如音頻歹撒,視頻莲组,圖片等等。暖夭。锹杈。
字符流:
1、使用字節(jié)流(FileInputStream)讀取一個文本文件(包含中文)迈着,邊讀邊看(打印)竭望,亂碼。原因裕菠?
GBK咬清,UTF-8,一個中文可能占多個字節(jié)糕韧。
如果使用字節(jié)流讀取數(shù)據(jù)枫振,按照字節(jié)來讀,一個字節(jié)一個字節(jié)的讀取萤彩,讀了一個字節(jié)粪滤,打印對應(yīng)的字符,所以存在了亂碼雀扶。一個漢字是多個字節(jié)杖小,但是讀一個字節(jié)看一個字節(jié),肯定亂碼愚墓。
2予权、字符流 = 字節(jié)流 + 解碼過程
字節(jié)組合操作 ——>當前環(huán)境的編碼集
字符流將讀取的編碼值,根據(jù)編碼集浪册,對應(yīng)的字符扫腺。
3、總結(jié):
所有的文件都可以是使用字節(jié)流村象。
圖片笆环,音頻,視頻厚者,壓縮文件躁劣,exe可以執(zhí)行文件。库菲。账忘。
文本文件,建議使用字符流。因為里面都是文本(字符)鳖擒。
2溉浙、FileWriter
1、構(gòu)造方法:
????????FileWriter(String path);
????????FileWriter(File file);
????????FileWriter(String path,boolean append);
????????FileWriter(File file, boolean append);
2蒋荚、寫出數(shù)據(jù)
????????void write(int)放航,將參數(shù)這個字符,寫出去
????????void write(char[] cs)圆裕,將整個cs數(shù)組的所有數(shù)據(jù),全部寫出
????????void write(char[] cs,int off,int len)荆几,將cs數(shù)組的一部分寫出吓妆,從下標off開始,len個
????????void write(String s)吨铸,直接將一個字符串寫出
????????void write(String s, int off,int len)行拢,寫出字符串的一部分
3、InputStreamReader
4诞吱、OutputStreamWriter
轉(zhuǎn)換流:輸入:InputStreamReader舟奠,繼承了Reader,讀取
轉(zhuǎn)換流:輸出:OutputStreamWriter房维,繼承了Writer沼瘫,寫出
構(gòu)造方法:
InputStreamReader(InputStream);//讀取字符為單位的數(shù)據(jù)
OutputStreamWriter(OutputStream);//寫出字符為單位的數(shù)據(jù)
InputStreamReader(InputStream,"編碼集");//讀取字符為單位的數(shù)據(jù)
OutputStreamWriter(OutputStream,"編碼集");//寫出字符為單位的數(shù)據(jù)
轉(zhuǎn)換了單位:字節(jié)-字符之間的橋梁
設(shè)置編碼:因為java采用的編碼Unicode編碼咙俩,程序應(yīng)該使用utf-8的編碼集耿戚。但是eclipse這個軟件的工作空間,默認的編碼集是gbk阿趁。為了一勞永逸膜蛔,更改工作空間的編碼集為utf-8。
OutputStream流:字節(jié)輸出流
FileOutputStream
write(int),寫一個字節(jié)
write(byte[] bs )脖阵,寫一個字節(jié)數(shù)組的數(shù)據(jù)
write(byte[] bs,int off, int len)皂股,寫出一個字節(jié)數(shù)組的一部分
?
Writer流:字符輸出流
FileWriter
write(int),寫一個字符
write(char[] cs)命黔,寫一個字符數(shù)組的數(shù)據(jù)
write(char[] cs,int off,int len)
write(String s)
write(String s,int off,int len)
A呜呐、4大基類流
????????InputStream
????????OutputSteam
????????Reader
????????Writer
B:文件流
????????FileInputStream
????????FileOutputStream
????????FileReader
????????FileWriter
C、緩存流
? ? ? ? BufferedInputStream
????????BufferedOutputStream
????????BufferedReader
????????BufferedWriter
D纷铣、對象流
????????ObjectInputStream
????????ObjectOutputStream
E:轉(zhuǎn)換流:
????????InputStreamReader
????????OutputStreamWriter
????????轉(zhuǎn)換單位:字節(jié)-字符之間的橋梁
功能:
????????節(jié)點流:直接接觸數(shù)據(jù)源的流
????????處理流:也叫過濾流卵史,套在別的流上的流。
關(guān)閉的時候:倒著關(guān)閉搜立∫郧或者干脆直接關(guān)閉處理流。
5、BufferedInputStream
6忧设、BufferedOutoutStream
7刁标、BufferedReader
????????新增的方法:readLine()--->String,每次讀取一行址晕。
8膀懈、BufferedWriter
????????新增的方法:newLine()-->void
????????寫換行:write("\r\n");????
????????緩存流(重點掌握):目的:高效谨垃。
原理:自帶了一個數(shù)組作為緩沖區(qū)启搂。讀寫發(fā)生在數(shù)組上。數(shù)組占內(nèi)存刘陶,速度很快胳赌。
FileInputStream
read()-->int,訪問磁盤,操作文件匙隔,讀一個字節(jié)回來疑苫。。
?
BufferedInputStream
read()-->int,先找緩沖區(qū)纷责,從緩沖區(qū)中讀取一個字節(jié)回來捍掺。fill(),讀取磁盤文件再膳,填充緩沖區(qū)
byte[] bs ,作為緩沖區(qū):1024*8挺勿。
?