使用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(); } } } |