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