探究java IO之FileInputStream類

使用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();
        }
    }
}
相關文章
相關標籤/搜索