Java IO流-高級流
IO流 高級流
緩沖流分為字節(jié)緩沖流與字符緩沖流
字節(jié)緩沖流分為BufferedInputStream(字節(jié)緩沖輸入流)和BufferedOutputStream(字節(jié)緩沖輸出流)
字符緩沖流分為BufferedReader(字符緩沖輸入流)與BufferedWriter(字符緩沖輸出流)
字節(jié)緩沖流

原理:底層自帶了長度為9182的緩沖區(qū)提高性能
例:一次拷貝一個字節(jié)
例:一次拷貝多個字節(jié)
字符緩沖流

原理:底層自帶了長度為8192的緩沖區(qū)提高性能
字符緩沖流的特有方法


readLine方法在讀取的時候,一次讀一整行,遇到回車換行結(jié)束,但是它不會把回車換行讀到內(nèi)存中
緩沖流為什么能提高性能?
緩沖流自帶長度為8192的緩沖區(qū)
可以顯著提高字節(jié)流的讀寫性能
對于字符流提升不明顯,對于字符緩沖流關鍵點是兩個特有的方法readLine()與newLine()
注意,文件流最好隨用隨創(chuàng)建,什么時候不用什么時候關閉
轉(zhuǎn)換流
轉(zhuǎn)換輸入流(InputStreamReader)
轉(zhuǎn)換輸出流(OutputStreamWriter)
JDK11后
轉(zhuǎn)換流的作用:字節(jié)流想使用字符流中的方法
例:利用字節(jié)流讀取文件中的數(shù)據(jù),每次讀一整行不出現(xiàn)亂碼
序列化流
ObjectOutputStream(序列化流)可以把Java中的對象寫到本地文件中


小細節(jié):使用對象輸出流將對象保存到文件時會出現(xiàn)NoteSerializableException異常 解決方案:讓Javabean類實現(xiàn)Serializable接口
Serializable接口沒有抽象方法(標記型接口)
反序列化流
ObjectInputStream(反序列化流)可以把序列化到本地文件中的對象讀取到程序中來


如果序列號不一樣會報錯
解決方案1:在類里面這樣定義
解決方案2:在IDEA里面設置自動產(chǎn)生序列號
transient瞬態(tài)關鍵字:不會把當前屬性序列序列化到本地文件中
序列化流與反序列化流細節(jié)
使用序列化流將對象寫到文件時,需要讓Javabean類實現(xiàn)Serializable接口,否則會出現(xiàn)NotSerializableException異常
序列化流寫到文件中的數(shù)據(jù)是不能修改的,一旦修改就無法再次讀回來了
序列化對象后,修改了Javabean類,再次反序列化會出問題:InvalidClassVersionUID(序列號版本號)
如果一個對象中的某個成員變量的值不想被序列化,可以加transient關鍵字修飾,該關鍵字標記的成員變量不參與序列化過程
打印流
分類:一般指PrintStream,PrintWriter兩個類
特點1:打印流只操作2文件目的地,不操作數(shù)據(jù)源
特點2:特有的寫出方法可以實現(xiàn)數(shù)據(jù)原樣寫出 如:打印97 ? 文件中:97 ? 打印true 文件中:true
特點3:特有的寫出方法可以實現(xiàn)自動刷新,自動換行 打印一次數(shù)據(jù)=寫出+換行+刷新
字節(jié)打印流

字節(jié)流底層沒有緩沖區(qū),開不開自動刷新都一樣

字符打印流

字符流底層有緩沖區(qū),想要自動刷新需開啟

成員方法與字節(jié)打印流一樣
打印流的應用場景
字節(jié)打印流:默認自動刷新
字符打印流:自動刷新需要開啟
解壓縮流
關鍵:壓縮包里的每一個文件或文件夾都是一個ZipEntry對象
壓縮流
壓縮本質(zhì):把每一個(文件/文件夾)看成ZipEntry對象放到壓縮包中
例:壓縮一個文件
Commos-io
Commos-io是apache開源基金組織提供的一組有關IO操作的開源工具包
作用:提高IO流的開發(fā)效率
Apache:專門為支持開源軟件項目而辦的一個非盈利性組織,成立于1999年,總部在美國馬里蘭州
使用步驟:
在項目中創(chuàng)建一個文件夾lib
將jar包復制粘貼到lib文件夾
右鍵點擊jar包,選擇Add as Library->OK
在類中導包使用


[hutool](入門和安裝 (hutool.cn): https://hutool.cn/docs/#/)國產(chǎn)Java工具包
