day36——IO流
一、上節(jié)課回顧
1、File類:文件和目錄
2、IO流:將數(shù)據(jù)從一個地方傳輸?shù)搅硪粋€地方。
? 原理:比如本地文件和程序,創(chuàng)建“管子”——>IO流,
3、IO的操作步驟:
step1:數(shù)據(jù)從哪到哪里:本地文件——程序,程序——本地文件,程序——網(wǎng)絡,網(wǎng)絡——程序。。。。
step2:創(chuàng)建流:
流向:輸入,輸出
單位:字節(jié),字符
子類流:
step3:操作流
輸入:讀取,read()
輸出:寫出,write()
step4:關閉流
釋放資源
4、常見的IO流
A:4個父類流(抽象的)
InputStream
OutputStream
Reader
Writer
B:文件流
FileInputStream
FileOutputStream
FileReader
FileWriter
5、操作流
讀取數(shù)據(jù):
int read(),每次只讀取一個字節(jié)的數(shù)據(jù)。返回值就是讀到的數(shù)據(jù)。末尾,-1
int read(byte[] bs),每次讀取多個字節(jié),數(shù)據(jù)存入到bs數(shù)組中。最多可以讀入數(shù)組的長度個,返回值是實際讀取的數(shù)量。末尾,-1.
int read(byte[] bs,int off,int len),每次讀取多個,數(shù)據(jù)存入到bs數(shù)組中,從off下標開始存儲,最多可以讀入len個,返回值才是實際讀取的數(shù)量。末尾,-1.
讀取-1
read()-->97
byte [] bs = new byte[1];
read(bs)-->1
寫出操作:
void write(int),寫出一個字節(jié),參數(shù)就是要寫出的這個字節(jié)數(shù)據(jù)
void write(byte[] bs),將bs數(shù)組中的所有數(shù)據(jù),全部寫出
void write(byte[] bs,int off,int len),寫出數(shù)組中的部分數(shù)據(jù),從下標off開始,len個。
復制文件:
源文件:960個字節(jié)
目標文件:960個字節(jié)
byte[] bs= new byte[200];
第一讀:200,寫:200,剩:760
第二讀:200,寫:200,剩:560
第三讀:200,寫:200,剩:360
第四讀:200,寫:200,剩:160
第五讀:160,寫:160,剩余:0
第六讀:-1.

1文件復制.png
二、本節(jié)課內(nèi)容
2.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
【禁止】?。?!使用字符流去操作非字符的文件。比如音頻,視頻,圖片等等。。。
字符流:
1、使用字節(jié)流(FileInputStream)讀取一個文本文件(包含中文),邊讀邊看(打印),亂碼。原因?
GBK,UTF-8,一個中文可能占多個字節(jié)。
如果使用字節(jié)流讀取數(shù)據(jù),按照字節(jié)來讀,一個字節(jié)一個字節(jié)的讀取,讀了一個字節(jié),打印對應的字符,所以存在了亂碼。一個漢字是多個字節(jié),但是讀一個字節(jié)看一個字節(jié),肯定亂碼。
2、字符流 = 字節(jié)流 + 解碼過程
字節(jié)組合操作 ——>當前環(huán)境的編碼集
字符流將讀取的編碼值,根據(jù)編碼集,對應的字符。
3、總結:
所有的文件都可以是使用字節(jié)流。
圖片,音頻,視頻,壓縮文件,exe可以執(zhí)行文件。。。
文本文件,建議使用字符流。因為里面都是文本(字符)。
2.2、FileWriter
1、構造方法:
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),寫出字符串的一部分
2.3、InputStreamReader
2.4、OutputStreamWriter
轉換流:輸入:InputStreamReader,繼承了Reader,讀取
轉換流:輸出:OutputStreamWriter,繼承了Writer,寫出
構造方法:
InputStreamReader(InputStream);//讀取字符為單位的數(shù)據(jù)
OutputStreamWriter(OutputStream);//寫出字符為單位的數(shù)據(jù)
InputStreamReader(InputStream,"編碼集");//讀取字符為單位的數(shù)據(jù)
OutputStreamWriter(OutputStream,"編碼集");//寫出字符為單位的數(shù)據(jù)
- 轉換了單位:字節(jié)-字符之間的橋梁
-
設置編碼:因為java采用的編碼Unicode編碼,程序應該使用utf-8的編碼集。但是eclipse這個軟件的工作空間,默認的編碼集是gbk。為了一勞永逸,更改工作空間的編碼集為utf-8。
eclipse切換工作空間.png

設置eclipse的工作空間的編碼集為utf-8.png
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)

3InputStreamReader流.png

4OutputStreamWriter.png
字符編碼:
本質(zhì):每個字符——>編碼值
a:97
b:98
A:65
B:66
。。。
編碼集:ASCII(美國標準信息交換碼)
每個國家都有個自己的編碼集:
中國:GBK編碼集,兼容了ASCII。
包含了我們中國的字符。
中:編碼值
國:編碼值
字符:都給排個編號,就是編碼值
編碼集:亂碼
編碼和解碼不對應,就會亂碼。
Unicode編碼:號稱統(tǒng)一了全世界的字符。
UTF-8
A、4大基類流
InputStream
OutputSteam
Reader
Writer
B:文件流
FileInputStream
FileOutputStream
FileReader
FileWriter
C、緩存流
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
D、對象流
ObjectInputStream
ObjectOutputStream
E:轉換流:
InputStreamReader
OutputStreamWriter
轉換單位:字節(jié)-字符之間的橋梁
指明編碼:
流的分類:
流向:輸入,輸出
單位:字節(jié),字符
功能:
節(jié)點流:直接接觸數(shù)據(jù)源的流
處理流:也叫過濾流,套在別的流上的流。
關閉的時候:倒著關閉?;蛘吒纱嘀苯雨P閉處理流。
2.5、BufferedInputStream
2.6、BufferedOutoutStream
2.7、BufferedReader
新增的方法:readLine()--->String,每次讀取一行。
2.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。

5緩存流.png
