Java-进阶:Java-File--IO—2
目錄
一、轉換流
 二、字節緩沖流
 三、字符緩沖流
 四、序列化流與反序列化流
 五、打印流
 六、標準輸入、輸出流
 七、IO流總結
一、轉換流
1. OutputStreamWriter 類
(1) 概述
- java.io.OutputStreamWriter繼承 Writer類;就是一個字符輸出流,寫文本文件;
- 是字符通向字節的橋梁,將 字符流 轉成 字節流
- write():字符,字符數組,字符串
(2) 構造方法
- OutputStreamWriter(OuputStream out):接收所有的字節輸出流
字節輸出流目前只有: FileOutputStream
- OutputStreamWriter(OutputStream out, String charsetName)
String charsetName:傳遞 編碼表名字:GBK、UTF-8
public class OutputStreamWriterDemo {public static void main(String[] args) throws IOException {writeUTF();}//轉換流對象OutputStreamWriter寫文本,采用UTF-8編碼表寫入public static void writeUTF()throws IOException{//創建字節輸出流,綁定文件FileOutputStream fos = new FileOutputStream("c:\\utf.txt");//創建轉換流對象,構造方法保證字節輸出流,并指定編碼表是UTF-8OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); //GBK可以不寫osw.write("你好");osw.close(); //使用close()連刷新帶關閉} }2. InputStreamReader 類
(1) 概述
- java.io.InputStreamReader繼承 Reader;是 字符輸入流,讀取文本文件
- 字節流向字符的橋梁,將 字節流 轉為 字符流
- 讀取的方法:read() 讀取1個字符,讀取字符數組
(2) 構造方法
- InputStreamReader(InputStream in):接收所有的 字節輸入流
可以傳遞的字節輸入流: FileInputStream
- InputStreamReader(InputStream in,String charsetName): 傳遞編碼表的名字
###3. 轉換流子類父類的區別
- 繼承關系
 OutputStreamWriter 的子類: FileWriter
 InputStreamReader 的子類:FileReader
- 區別
- OutputStreamWriter 和 InputStreamReader 是字符和字節的橋梁:也可以稱之為字符轉換流。字符轉換流原理:字節流 + 編碼表
- FileWriter 和 FileReader:作為子類,僅作為操作字符文件的便捷類存在。當操作的字符文件,使用的是默認編碼表時可以不用父類,而直接用子類就完成操作了,簡化了代碼。
- 以下三句話功能相同
InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”));//默認字符集。
 InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”),“GBK”);//指定GBK字符集。
 FileReader fr = new FileReader(“a.txt”);
注意:一旦要指定其他編碼時,絕對不能用子類,必須使用字符轉換流。什么時候用子類呢?
 條件:1、操作的是文件。2、使用默認編碼。
二、字節緩沖流
1. 概述
- 可提高IO流的讀寫速度
- 分為字節緩沖流與字符緩沖流
2. 字節輸出緩沖流 BufferedOutputStream
- java.io.BufferedOuputStream作用: 提高原有輸出流的寫入效率
- BufferedOuputStream 繼承 OutputStream
- 方法:寫入 write 字節,字節數組
- 構造方法:BufferedOuputStream(OuputStream out):可以傳遞任意的字節輸出流,傳遞的是哪個字節流,就對哪個字節流提高效率
3. 字節輸入緩沖流 BufferedInputStream
- BufferedInputStream,繼承 InputStream ,標準的字節輸入流
- 讀取方法: read() ,單個字節,字節數組
- 構造方法: BufferedInputStream(InputStream in):可以傳遞任意的字節輸入流,傳遞是誰,就提高誰的效率
- 可以傳遞的字節輸入流 FileInputStream
4. 四種文件復制方式的效率比較
- 結論:
- 字節流讀寫單個字節 :125250 毫秒
- 字節流讀寫字節數組 :193 毫秒
- 字節流緩沖區流讀寫單個字節:1210 毫秒
- 字節流緩沖區流讀寫字節數組 :73 毫秒
- 代碼
三、字符緩沖流
1. 字符輸出緩沖流 BufferedWriter
- java.io.BufferedWriter繼承 Writer
- 寫入方法: write () ,單個字符,字符數組,字符串
- 構造方法:BufferedWriter(Writer w):傳遞任意字符輸出流,傳遞誰,就高效誰
- 能傳遞的字符輸出流: FileWriter, OutputStreamWriter
2. 字符輸出緩沖流 BufferedWriter—特有方法 newLine
- void newLine(): 寫換行
- newLine():文本中換行, \r\n也是文本換行
- 方法具有平臺無關性
windows \r\n ; Linux \n
- newLine()運行結果和操作系統是相互關聯的
- JVM: 安裝的是 Windows 版本,newLine()寫的就是 \r\n;安裝的是 Linux 版本,newLine() 寫的就是**\n**
3.字符輸入流緩沖流 BufferedReader
(1)概述
- java.io.BufferedReader繼承 Reader,從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取
 讀取功能: read(), 單個字符,字符數組
 構造方法:BufferedReader(Reader r):可以任意的字符輸入流,有:FileReaderInputStreamReader
(2)BufferedReader 自己的功能
- String readLine(): 讀取文本行 \r\n ,讀取一個文本行,包含該行內容的字符串,不包含任何行終止符,如果已到達流末尾,則返回 null
獲取內容的方法一般都有返回值
 int:沒有返回的都是 負數
 引用類型: 找不到返回 null
 boolean: 找不到返回 false
4. 字符流緩沖區流復制文本文件
/** 使用緩沖區流對象,復制文本文件* 數據源 BufferedReader+FileReader 讀取* 數據目的 BufferedWriter+FileWriter 寫入* 讀取文本行, 讀一行,寫一行,寫換行*/ public class Copy_1 {public static void main(String[] args) throws IOException{BufferedReader bfr = new BufferedReader(new FileReader("c:\\w.log")); BufferedWriter bfw = new BufferedWriter(new FileWriter("d:\\w.log"));//讀取文本行, 讀一行,寫一行,寫換行String line = null;while((line = bfr.readLine())!=null){bfw.write(line);bfw.newLine();bfw.flush();}bfw.close();bfr.close();} }四、序列化流與反序列化流
1. 概述
- 對象的序列化:對象中的數據,以流的形式,寫入到文件中保存過程稱為寫出對象,ObjectOutputStream將對象寫道文件中,實現序列化
- 對象的反序列化:在文件中,以流的形式,將對象讀出來,讀取對象,ObjectInputStream將文件對象讀取出來
2. 實現
- ObjectOutputStream: 寫對象,實現序列化 - 構造方法:ObjectOutputStream(OutputSteam out):傳遞任意的 字節輸出流
- void writeObject(Object obj):寫出對象
 
- ObjectInputStream:讀取對象,實現反序列化 - 構造方法:ObjectInputStream(InputStream in):傳遞任意的 字節輸入流,輸入流封裝文件,必須是序列化的文件
 
- Object readObject(): 讀取對象
3. 細節
(1)transient 瞬態關鍵字
- 作用: 被 transient修飾的屬性不會被序列化
- transient關鍵字只能修飾成員變量
(2)靜態不能序列化
- 原因:序列化是把對象數據進行持久化存儲;靜態的東西不屬于對象,而屬于類
(3)Serializable 接口
- 作用:給需要序列化的類上加標記。該標記中沒有任何抽象方法;只有實現了 Serializable接口的類的對象才能被序列化
4. 序列化中的序列號沖突問題
-  問題產生: 當一個類實現Serializable接口后,創建對象并將對象寫入文件,之后更改了源代碼 (比如:將成員變量的修飾符有private改成public),再次從文件中讀取對象時會報異常 
-  原因:一旦修改了源碼,重新編譯產生class文件,會根據類的成員重新計算序列號,這樣新編譯的class文件中的序列號,與原來文件中的序列號就不同了 
-  解決:需要做一個終身不變的序列號! 需要在序列化中自定義序列號 
五、打印流
1. 概述
- 打印流添加輸出數據的功能,使它們能夠方便地打印各種數據值表示形式.
2. 打印流根據流的分類
- 字節打印流 PrintStream
- 字符打印流 PrintWriter
3. 方法
- void print(String str): 輸出任意類型的數據,
- void println(String str): 輸出任意類型的數據,自動寫入換行操作
4. 特點
- 此流不負責數據源,只負責數據目的
- 可以操作任意類型的數據。(boolean, int, long, float, double)
- 打印流,可以開啟自動刷新功能
 滿足兩個條件:- 使用特定的構造方法,打開打印流的自動刷新,輸出的數據目的必須是流對象:OutputStreamWriter
- 必須調用 println,printf,format三個方法中的一個,啟用自動刷新
 
- 為其他輸出流,添加功能
- 永遠不會拋出 IOException,但是可能拋出別的異常
5. 構造方法
- 就是打印流的輸出目的端
- PrintStream構造方法 - 接收File類型,接收字符串文件名,接收字節輸出流OutputStream
 
- PrintWriter構造方法 - 接收File類型,接收字符串文件名,接收字節輸出流OutputStream, 接收字符輸出流Writer
 
6. 打印字符數組
- println數組,只有打印字符數組時是打印內容,其余均打印數組的地址
- 因為api中定義了打印字符數組的方法,其底層是在遍歷數組中的元素,而其他打印數組的方法,都是將數組對象編程Object,其底層再將對象編程String,調用了 String s = String.valueOf(x);方法
7. 利用打印流,完成文本文件的復制
/** 打印流實現文本復制* 讀取數據源 BufferedReader+File 讀取文本行* 寫入數據目的 PrintWriter+println 自動刷新*/ public class PrintWriterDemo1 {public static void main(String[] args) throws IOException{BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));PrintWriter pw = new PrintWriter(new FileWriter("d:\\a.txt"),true);String line = null;while((line = bfr.readLine())!=null){pw.println(line);}pw.close();bfr.close();} }六、標準輸入、輸出流
1. 概述
- 標準輸入流: System.in默認指鍵盤輸入
- 標準輸出流: System.out向顯示器輸出
2. 繼承關系
- PrintStream extends FilterOutputStream
- FilterOutputStream extends OutputStream
3. 案例
public class StandardIO {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s;// 標準輸入流的read方法,讀取鍵盤數據的時候,當當前沒有鍵盤輸入數據的時候// read會阻塞當前線程,使得不能結束,只有自定義協議,才能結束標準輸入流while((s = br.readLine()) != null) {//自定協議,當用戶輸入886結束接收用戶輸入if("886".equals(s)) {break;}System.out.println("輸出:" + s);}br.close();} }七、IO流總結
- 字節流 - 字節輸入流 InputStream - FileInputStream 操作文件的字節輸入流
- BufferedInputStream高效的字節輸入流
- ObjectInputStream 反序列化流
 
- 字節輸出流 OutputStram - FileOutputStream 操作文件的字節輸出流
- BufferedOutputStream 高效的字節輸出流
- ObjectOuputStream 序列化流
- PrintStream 字節打印流
 
 
- 字節輸入流 InputStream 
- 字符流 - 字符輸入流 Reader - FileReader 操作文件的字符輸入流
- BufferedReader 高效的字符輸入流
- InputStreamReader 輸入操作的轉換流(把字節流封裝成字符流)
 
- 字符輸出流 Writer - FileWriter 操作文件的字符輸出流
- BufferedWriter 高效的字符輸出流
- OutputStreamWriter 輸出操作的轉換流(把字節流封裝成字符流)
- PrintWriter 字符打印流
 
 
- 字符輸入流 Reader 
- 方法: - 讀數據方法: - read() 一次讀一個字節或字符的方法
- read(byte[] char[]) 一次讀一個數組數據的方法
- readLine() 一次讀一行字符串的方法(BufferedReader類特有方法)
- readObject() 從流中讀取對象(ObjectInputStream特有方法)
 
- 寫數據方法: - write(int) 一次寫一個字節或字符到文件中
- write(byte[] char[]) 一次寫一個數組數據到文件中
- write(String) 一次寫一個字符串內容到文件中
- writeObject(Object ) 寫對象到流中(ObjectOutputStream類特有方法)
- newLine() 寫一個換行符號(BufferedWriter類特有方法)
 
 
- 讀數據方法: 
- 向文件中寫入數據的過程
 1,創建輸出流對象
 2,寫數據到文件
 3,關閉輸出流
- 從文件中讀數據的過程
 1, 創建輸入流對象
 2, 從文件中讀數據
 3, 關閉輸入流
- 文件復制的過程
 1, 創建輸入流(數據源)
 2, 創建輸出流(目的地)
 3, 從輸入流中讀數據
 4, 通過輸出流,把數據寫入目的地
 5, 關閉流
File類
- 方法
- 獲取文件名稱 getName()
- 獲取文件絕對路徑 getAbsolutePath()
- 獲取文件大小 length()
- 獲取當前文件夾中所有File對象 File[] listFiles()
- 判斷是否為文件 isFile()
- 判斷是否為文件夾 isDirectory()
- 創建文件夾 mkdir() mkdirs()
- 創建文件 createNewFile()
- 異常 - try…catch…finally捕獲處理異常
- throws 聲明異常
- throw 拋出異常對象
 
- 異常的分類 - 編譯期異常 Exception
- 運行期異常 RuntimeException
 
- 注意: - 編譯期異常,必須處理,不然無法編譯通過
- 運行期異常,程序運行過程中,產生的異常信息
 
- 實現文件內容的自動追加 - 構造方法 - FileOutputStream(File file, boolean append)
- FileOutputStream(String fileName, boolean append)
- FileWriter(File, boolean append)
- FileWriter(String fileName, boolean append)
 
 
- 構造方法 
- 實現文件內容的自動刷新 - 構造方法 - PrintStream(OutputStream out, boolean autoFlush)
- PrintWriter(OutputStream out, boolean autoFlush)
 
 
- 構造方法 
- 異常 - try…catch…finally捕獲處理異常
- throws 聲明異常
- throw 拋出異常對象
 
- 異常的分類 - 編譯期異常 Exception
- 運行期異常 RuntimeException
 
- 注意: - 編譯期異常,必須處理,不然無法編譯通過
- 運行期異常,程序運行過程中,產生的異常信息
 
- 實現文件內容的自動追加 - 構造方法 - FileOutputStream(File file, boolean append)
- FileOutputStream(String fileName, boolean append)
- FileWriter(File, boolean append)
- FileWriter(String fileName, boolean append)
 
 
- 構造方法 
- 實現文件內容的自動刷新 - 構造方法 - PrintStream(OutputStream out, boolean autoFlush)
- PrintWriter(OutputStream out, boolean autoFlush)
 
 
- 構造方法 
總結
以上是生活随笔為你收集整理的Java-进阶:Java-File--IO—2的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 不孕不育主要做哪几项检查
- 下一篇: 玩英雄联盟lol的时候我下载好在安装的时
