Java IO流-字節流
2017-11-05 17:48:17
Java中的IO流按數據類型分類分為兩種,一是字節流,二是字符流。字符流的出現是為了簡化文本數據的讀入和寫出操作。
如果操作的文件是文本文件,那麽使用字符流會大大簡化操作,但是如果什麽都不知道,就用字節流。
- 字節流
字節流的兩個抽象基類是:InputStream
OutputStream
抽象類顯然是無法實例化的,所以需要尋找相應的子類來進行操作。下面討論兩個很重要的字節輸入輸出流子類。
* FileOutputStream
FileOutputStream
用於寫入諸如圖像數據之類的原始字節的流。要寫入字符流,請考慮使用 FileWriter
**構造方法
從Api中可以看出,既可以使用File類來初始化,也可以直接使用地址字符串來初始化。
如果文件不存在,會自動新建該文件。
**常用方法
import java.io.FileOutputStream; import java.io.IOException; public class Demo1 { public static void main(String[] args) throws IOException { FileOutputStream file = new FileOutputStream("E:\\text.txt"); byte[] b = "Hello Spring.\r\n".getBytes(); file.write(b); file.write("Hello World.".getBytes()); file.close(); } }
換行符問題:在這裏需要註意一個問題,就是換行符的問題。不同系統針對換行符的識別是不同的。
首先解釋一下 \r:表示回車
\n:表示換行
Windows系統裏面,每行結尾是 回車+換行(CR+LF),即“\r\n”;Unix系統裏,每行結尾只有 換行CR,即“\n”; Mac系統裏,每行結尾是 回車CR 即‘\r‘。
高級記事本或者編輯器比如sublime裏會自動識別不同的換行符,如果寫的\n,在記事本中打開是不顯示換行的,但是在sublime中會正常換行。
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo1 { public static void main(String[] args){ FileOutputStream file = null; try{ file=new FileOutputStream("E:\\text.txt"); byte[] b = "Hello Spring.\n".getBytes(); file.write(b); file.write("Hello World.".getBytes());} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if(file!=null) { try { file.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
* FileInputStream
FileInputStream
用於讀取諸如圖像數據之類的原始字節流。要讀取字符流,請考慮使用 FileReader
。
**構造方法
**常用方法
如果因為已經到達文件末尾而沒有更多的數據,則返回 -1
。
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo1 { public static void main(String[] args) throws IOException { FileInputStream fin = new FileInputStream("E:\\text.txt"); FileOutputStream fout = new FileOutputStream("E:\\text2.txt"); byte[] b = new byte[5]; int len = 0; while ((len = fin.read(b)) != -1) { fout.write(b, 0, len); } fin.close(); fout.close(); } }
返回值為當次讀取到的字節數,如果到達文件末尾則返回-1。在寫文件的時候,必須使用偏移法進行寫入,否則會有覆蓋問題。
一般一次讀1024或者1024的整數倍,就是一次讀1kb或者多kb。
==>顯然的,在讀寫的時候如果使用數組的話,會大大提高效率,所以Java在設計的時候也考慮到了這個問題並提供了
字節緩沖區流:BufferedOutputStream,BufferedInputStream。
* BufferedOutputStream
BufferedOutputStream:該類實現緩沖的輸出流。通過設置這種輸出流,應用程序就可以將各個字節寫入底層輸出流中,而不必針對每次字節寫入調用底層系統。
**構造方法
構造方法可以指定緩沖區的大小,一般來說使用默認緩沖區大小就夠了。
**常用方法
當然也可以直接寫byte[] b,指的是把長度為len的字節數組都寫入。
* BufferedInputStream
BufferedInputStream
為另一個輸入流添加一些功能,即緩沖輸入以及支持 mark
和 reset
方法的能力。在創建 BufferedInputStream
時,會創建一個內部緩沖區數組。在讀取或跳過流中的字節時,可根據需要從包含的輸入流再次填充該內部緩沖區,一次填充多個字節。mark
操作記錄輸入流中的某個點,reset
操作使得在從包含的輸入流中獲取新字節之前,再次讀取自最後一次 mark
操作後讀取的所有字節。
**構造方法
**常用方法
使用Buffered緩沖流在使用的時候和基本的File流沒有差異,不過在底層進行了優化,所以導致效率大大提高。
Java IO流-字節流