使用FileInputStream類建立的InputStream對象能夠用於從文件讀取內容。兩個經常使用的構造函數以下所示:java
FileInputStream(String filePath) FileInputStream(File fileObj)
這兩個構造函數都會拋出FileNotFoundException異常。其中,filePath是文件的完整路徑名,fileObj是描述文件的File對象。函數
下面的例子建立了兩個FileInputStream對象,它們使用相同的磁盤文件,而且分別是使用這兩個構造函數建立的:spa
FileInputStream f0 = new FileInputStream("/autoexec.bat"); File f = new File("/autoexec.bat"); FileInputStream f1 = new FileInputStream(f);
儘管第一個構造函數可能更經常使用,可是使用第二個構造函數,在將文件附加到輸入流以前,能夠使用File類的方法對文件進行進一步檢查。當建立FileInputStream對象時,還能夠爲讀取而打開流。FileInputStream類重寫了InputStream抽象類中的6個方法,但沒有重寫mark()和reset()方法。當在FileInputStream對象上試圖調用reset()方法,會拋出IOException異常。code
如例:對象
package io; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class FileInputStreamDemo1 { public static void main(String[] args) { try(InputStream in = new FileInputStream( "/home/fuhd/work/workspace/java/decompile/src/com/fhd/DownloadApkUtil.java"); OutputStream out = new BufferedOutputStream(System.out)){ int num = in.available(); System.out.println("文件總大小爲:" + num + "字節"); int k; byte[] buffer = new byte[1024]; while((k = in.read(buffer)) != -1){ /* * 這裏最好定義成從0下標讀取,讀取K個字節,以避免形成重複讀取之前的數據。 * 好比,最後一次讀取字節沒有裝載滿buffer時,沒被裝載的空間可能仍是上一次 * 的數據。例如:上次讀取到buffer的爲:[1,2,3,4,5,6],而這一次最後讀取了7,8,9 * 這三個數,那如今buffer中爲:[7,8,9,4,5,6],若是直接用out.write(buffer)讀會 * 讀出多餘的數據,因此使用out.write(buffer,0,k)就不會重複讀取。 */ out.write(buffer,0,k); } }catch(IOException e){ e.printStackTrace(); } } }