目錄
1、概述
2、IO流體系
3、FileOutputStream
4、FileInputStream
5、try...catch異常處理
6、字元集詳解
6.1 GB2312字元集:
6.2 BIG5字元集:
6.3 GBK字元集:
6.4 Unicode字元集:
6.5 亂碼
7、字元流
7.1 FileReader
7.2 FileWriter
8、編碼、解碼
9、緩沖流
9.1 位元組緩沖流
9.2 字元緩沖流
10、轉換流
11、序列化流與反序列化流
11.1 序列化流
11.2 反序列化流
11.3 版本号、序列号
12、列印流
12.1 位元組列印流
12.2 字元列印流
13、解壓縮流、壓縮流
13.1 解壓縮流
13.2 壓縮流
13.2.1 壓縮單個檔案
13.2.2 壓縮檔案夾
1、概述
IO流:用于讀寫檔案中的資料(可以讀寫檔案,或網絡中的資料)
在IO流中,以程式為參照物判斷讀寫
IO流分類:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 純文字檔案:用Windows自帶的記事本打開能讀懂的檔案
2、IO流體系
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 3、FileOutputStream
作用:操作本地檔案的位元組輸出流,可以把程式中的資料寫到本地檔案中
寫出步驟:
- 建立位元組輸出流對象
- 寫資料
- 釋放資源
細節:
- 參數是字元串表示的路徑或是File對象都可
- 如果檔案不存在會建立一個新的檔案,但要保證父級路徑是存在的
- 如果檔案已經存在,則會清空檔案
- write方法的參數是整數,但是實際上寫到本地檔案中的是整數在ASCII上對應的字元
FileOutputStream寫資料的三種方式:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 換行與續寫:
換行寫:再寫出一個換行符就可以了(Windows:\r\n Linux: \n Mac: \r)
在Windows作業系統中,java對回車換行進行了優化,雖然完整的是"\r\n",但我們隻寫一個“\r”或"\n",java也可執行,因為java在底層會補全
續寫:
如果想續寫,打開續寫開關即可
開關位置:建立對象的第二個參數
預設false:關閉續寫,此時建立對象會清空檔案
手動傳true:打開續寫,此時建立對象不會清空檔案
4、FileInputStream
作用:操作本地檔案的位元組輸入流,可以把本地檔案中的資料讀取到程式中來
書寫步驟:
- 建立位元組輸入流對象
- 讀資料
- 釋放資源
細節:
- 如果檔案不存在,會直接報錯
- 一次讀一個位元組,讀出來的是資料在ASCII上的數字
- 讀到檔案末尾了,read方法傳回-1
循環讀取:
FileInputStream fis = new FileInputStream("....");
int b; //一定要定義第三方變量
while((b = fis.read()) != -1) {
System.out.println((char) b);
}
5、try...catch異常處理
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 6、字元集詳解
6.1 GB2312字元集:
1980年釋出,1981年5月1日實施的簡體中文漢字編碼國家标準。收集7445個圖形字元,其中包括6763個簡體漢字
6.2 BIG5字元集:
台灣地區繁體中文标準字元集,共收錄13053個中文字,1984年實施
6.3 GBK字元集:
2000年3月17日釋出,收錄21003個漢字
包含國家标準GB13000-1中的全部中日韓漢字,和BIG5編碼中的所有漢字
Windows系統預設使用的就是GBK。系統顯示ANSI
存儲規則:
- 漢字:以兩個位元組存儲,高位位元組二進制一定以1開頭,轉為十進制之後是一個負數
- 英文:一個位元組存儲,相容ASCII,二進制前面補0
6.4 Unicode字元集:
國際标準字元集,它将世界各種語言的每個字元定義一個唯一的編碼,以滿足跨語言、跨平台的文本資訊轉換。又叫萬國碼。
6.5 亂碼
原因:
- 讀取資料時為讀完整個漢字
- 編碼和解碼時的方式不統一
7、字元流
字元流的底層啟示就是位元組流,用于解決中文亂碼的第一個原因
字元流=位元組流+字元集
特點:
- 輸入流:一次讀一個位元組,遇到中文時,一次讀多個位元組
- 輸出流:底層會把資料按照指定的編碼方式進行編碼,程式設計位元組再寫到檔案中
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 7.1 FileReader
步驟:
1、建立對象
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 2、讀取資料
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 3、釋放資源
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 7.2 FileWriter
構造方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 成員方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 8、編碼、解碼
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 9、緩沖流
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 9.1 位元組緩沖流
原理:底層自帶了長度為9182的緩沖區提高性能
構造方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 注意:緩沖流不能單獨存在,需結合基本流使用
例如:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("..."));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("...."));
byte[] bytes = new byte[1024];
int len;
while((len = bis.read(bytes)) != -1) {
bos.write(bytes,0,len);
}
bos.close;
bis.close;
9.2 字元緩沖流
原理:底層自帶了長度為9182的緩沖區提高性能
構造方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 10、轉換流
轉換流是位元組流與字元流之間的橋梁
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 使用場景:
- 指定字元集讀寫(JDK11後淘汰)
- 位元組流想要使用字元流中的方法
11、序列化流與反序列化流
11.1 序列化流
可以把java中的對象寫到本地檔案中
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 11.2 反序列化流
可以把序列化到本地檔案中的對象,讀取到程式中來
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 11.3 版本号、序列号
解決更新Javabean類後已經儲存的本地檔案無法讀取問題,在類中添加:
private static final long serialVersionUID = ...............;
細節彙總:
- 使用序列化流将對象寫到檔案時,需要讓Javabean類實作Serializable接口。否則,會出現NotSerializableException異常
- 序列化流寫到檔案中的資料是不能修改的,一旦修改就無法再次讀回來了
- 序列化對象後,修改了Javabean類,再次反序列化,會出問題,會抛出InvalidClassException異常,可通過添加序列化解決
- 如果一個對象中的某個成員變量的值不想被序列化,可以給該成員變量加transient關鍵字,該關鍵字标記的成員變量不參與序列化過程
12、列印流
分類:
列印流一般是指:PrintStream,PrintWriter兩個類
特點:
- 列印流隻操作檔案的目的地,不操作資料源
- 特有的寫出方法可以實作,資料原樣寫出
- 特有的寫出方法,可以實作自動重新整理,自動換行
12.1 位元組列印流
位元組流底層無緩沖區,開不開自動重新整理都一樣
構造方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 成員方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 12.2 字元列印流
字元流底層有緩沖區,想要自動重新整理需要開啟
構造方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 成員方法:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 13、解壓縮流、壓縮流
13.1 解壓縮流
解壓本質:
把每一個ZipEntry按照層級拷貝到本地另一個檔案夾中
例:
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 13.2 壓縮流
壓縮本質:
把每一個(檔案/檔案夾)看成ZipEntry對象放到壓縮包中
13.2.1 壓縮單個檔案
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流 13.2.2 壓縮檔案夾
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流
18 IO流1、概述2、IO流體系3、FileOutputStream4、FileInputStream5、try...catch異常處理6、字元集詳解7、字元流8、編碼、解碼9、緩沖流11、序列化流與反序列化流12、列印流13、解壓縮流、壓縮流