- - - - | 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)的區別示意圖如下