[转]探究java IO之FileInputStream类

使用FileInputStream类创建的InputStream对象可以用于从文件读取内容。两个常用的构造函数如下所示:

1
2
FileInputStream(String filePath)
FileInputStream(File fileObj)

这两个构造函数都会抛出FileNotFoundException异常。其中,filePath是文件的完整路径名,fileObj是描述文件的File对象。

下面的例子创建了两个FileInputStream对象,它们使用相同的磁盘文件,并且分别是使用这两个构造函数创建的:

1
2
3
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异常。

如例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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();
        }
    }
}
原文地址:https://www.cnblogs.com/xunbu7/p/5023767.html