探究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();
        }
    }
}
相关文章
相关标签/搜索