FileInputStream 輸入字節流(從硬盤向內存讀取)

- - - - |  InputStream 所有輸入字節流的基類,繼承Object類。是abstract抽象類。

- - - - - - - - |  FileInputStream 讀取文件數據的輸入字節流。

3.1 讀取數據的步驟(使用FileInputStream讀取文件數據)

1.找到目標文件    File file = new File("E:\\aa\\bb\\a.txt")

2.搭建數據傳輸通道(橋樑) FileInputStream fis = new FileInputStream(file);

3.傳輸數據(讀取數據) fis.read()

4.關閉通道(釋放資源)fis.close()

3.2 案例

public class Dome1 {
    public static void main(String[] args) throws IOException {
        // 1.確定目標文件
        File file = new File("E:\\aa\\bb\\aaa.wmv");

        // 2.搭建橋樑
        FileInputStream fileInputStream = new FileInputStream(file);

        // 3.讀取數據
        // 創建緩衝字節數組
        byte[] bytes = new byte[1024 * 10];//存儲讀取到的數據。緩衝數組的長度一般是1024的倍數,與計算機的處理單位保持一致。理論上緩衝數組越大,效率越高
        int length = 0;//保存每次讀取到的字節個數。
        // 循環讀取文件內容
        while ((length = fileInputStream.read(bytes)) != -1) {//read()讀取不到數據時返回-1
            System.out.println("讀取到的內容是:" + new String(bytes, 0, length));// 使用String將字符數組構建成字符串
        }

        // 4.釋放資源
        fileInputStream.close();
    }
}

 

3.3讀取文件注意細節

問題1:FileInputStream讀取文件的時候,不關閉資源會有什麼影響?

答案:資源文件一旦使用完畢,需要馬上釋放資源,否則其他的程序無法對該資源文件進行其他操作。

 

問題2:使用String將字符數構建字符串時,new String(bytes) 與 new String(bytes,0,length)的區別

答案:

        length是數組長度。(另外,本人知道這兩種模式的區別,但是不知道該怎麼表示,歡迎大佬們使用專業術語進行更正,萬分感謝。)

(1)使用new String(bytes)將數組構建成字符串時,使用的是覆蓋機制。

        第一次讀取length個字節,

        第二次再讀取length個字節,直接覆蓋掉第一組,

        依次類推……

        當最後一組不足length個字節時,會將最後一組的字節覆蓋到倒數第二組對應的位置,不足length個字節的部分,會使用倒數第二組未被覆蓋的部分補足,這樣就產生了弊端。不建議使用

  

(2) 使用 new String(bytes,0,length)將數組構建成字符串時,使用的是先清空再讀取的機制。

      第一次讀取length個字節,

      清空第一組字節,然後讀取第二組length個字節,

      以此類推……

      當最後一組不足length個字節時,將最後一組覆蓋到數組中,不足部分爲空。

注意:new String(bytes) 與 new String(bytes,0,length)的區別示意圖如下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章