天天看點

7.位元組流、字元流

位元組流

IO流分類和功能:

按照資料流向:輸入和輸出流(讀進來,寫出去)

按照資料類型:位元組流和字元流

底層原理:一切皆為位元組

位元組輸出流的最高抽象父類:

java.io.OutputStream:是位元組輸出流的最高抽象父類

其中,常用的方法:

7.位元組流、字元流

常用的子類是:java.io.FileOutputStream。

構造方法:

public FileOutputStream(String filename):參數代表檔案的路徑。

public FileOutputStream(File file):參數代表檔案對象。

輸入字元串時需要用get.Bytes()方法

追加資料内容:append

7.位元組流、字元流

換行

檔案換行:\r\n(這兩個字元)

Linux換行符:\n(這是一個字元)

7.位元組流、字元流

位元組輸入流的最高抽象父類

java.io.InputStream是位元組輸入流的最高抽象父類。      
其中定義的常用方法:

public int read():讀取單個位元組。

public int read(byte[] buf):讀取位元組數組,傳回有效個數。

public void close():關閉流,釋放資源。      
常用的子類是:java.io.FileInputStream類。      
構造方法:

public FileInputStream(String filename):參數代表檔案路徑。

public FileInputStream(File file):參數代表檔案對象。      
使用步驟:

1. 創:建立FileInputStream對象,指定檔案路徑。

2. 讀:調用read方法讀取位元組資料。

3. 關:調用close方法關閉流。      
注意事項:

1. 對于寫檔案來說,如果不存在則自動建立;對于讀檔案來說,如果不存在則會發生      
FileNotFoundException。

2. 這個read()每次執行都會嘗試讀取下一個,如果沒有下一個則傳回-1值。      
每次循環執行了兩次read方法      

read讀取位元組的方法還有一個重要的重載形式

read(byte[2])

7.位元組流、字元流

數組

7.位元組流、字元流

複制檔案(用位元組)

7.位元組流、字元流
7.位元組流、字元流

改換複制檔案方式(用位元組數組)

7.位元組流、字元流

字元流

  1. Idea工具檢視檔案與Windows産看的位元組大小不一樣。

因為編碼方式不一樣。

  1. 字元流底層
也是位元組流,但是還有位元組和字元之間的翻譯功能。參考的是:ASCII/Unicode。      
  1. 字元讀入最高抽象父類reader
java.io.Reader是字元輸入流的最高抽象父類。      
  1. 常用方法

    public int read():傳回值代表讀取的【單個字元】。

    public int read(char[] buf):讀取一個字元數組,傳回有效個數。

    public void close():關閉流。

7.位元組流、字元流
7.位元組流、字元流
  1. 常用子類
java.io.FileReader      
  1. 構造方法
public FileReader(String filename):參數代表檔案路徑名。

public FileReader(File file):參數代表檔案對象。      
  1. 注意事項
字元流應該隻用來處理純文字檔案,凡是能用Windows預設記事本打開并且正确識别的。      
  1. 字元數組outStream
7.位元組流、字元流
  1. 字元讀進去最高抽象父類
java.io.Writer是字元輸出流的最高抽象父類,其中定義的方法有:

public void write(int ch):寫單個字元

public void write(char[] buf):寫整個字元數組

public void write(char[] buf, int offset, int length):寫字元數組的一部分。

public void write(String str):寫整個字元串

public void write(String str, int offset, int length):寫字元串的一部分。

public void close():關閉流      
  1. 常用的子類writer

常用的子類是:java.io.FileWriter

構造方法:

public FileWriter(String filename):參數代表檔案路徑名。

public FileWriter(String filename, boolean append):第二個參數代表是否追加。

public FileWriter(File file):參數代表檔案對象。

public FileWriter(File file, boolean append):第二個參數代表是否追加。

7.位元組流、字元流

輸出流中一個flush方法

  1. 緩沖區在讀寫資料的過程中有兩個方向

從write –>jvm緩沖區 -> OS ->

從檔案到到資料:

硬碟->-OS -> jvm緩沖區->write

  1. 使用建議
flush方法:重新整理緩沖區。

close方法:内部也包含一個flush動作,并且關閉流。



使用建議:除非有極強的時效性或者資料穩定性要求,否則盡量避免頻繁調用flush方法。

FileOutputStream裡面沒有緩沖區,是以flush方法根本沒用。

FileInputStream/FileReader/FileWriter底層都有byte[8192]位元組數組作為緩沖區。      
後三者當中:

讀資料:一次性讀取8192個位元組,read方法是從中取出一些位元組進行使用。如果緩沖區用完了      
空了,再次讀取最多8192個位元組。

寫資料:每次write方法隻是将資料寫到8192位元組數組當中,如果滿了自動刷。      

補充:

  1. a.沒有Java7和Java9的新特性,怎麼能始終執行close方法?

能嵌套try catch和if判斷

7.位元組流、字元流
7.位元組流、字元流

b.進一步優化,建立一個CloseUtil工具

7.位元組流、字元流
7.位元組流、字元流
  1. try-with-resource
7.位元組流、字元流
7.位元組流、字元流
  1. 集合Properties工具類
7.位元組流、字元流
7.位元組流、字元流

(怎麼打開一張圖)

  1. Properties中load方法
7.位元組流、字元流