15.4.4 使用文件字节输入流读取文件
“FileInputStream”类与前面说过的“InputStream”类有点相似,其实“FileInputStream”类就是“InputStream”的子类,并且其不是一个抽象类。这样,程序员就可以利用“FileInputStream”类的对象来使用前面的方法。
下面先看如何构造一个“FileInputStream”类的对象,这需要用到类的构造器。下面是“FileInputStream”类的构造器种类。
public FileInputStream(String name):创建一个FileInputStream对象,从以name为名称的文件名称中读取数据。
public FileInputStream(File file):创建一个FileInputStream对象。从指定的对象file中读取数据。
【实例15.4】先看一个有关“FileInputStream”类的实例。
01 import java.io.*;
02 ///创建一个文件类f
03 ///创建一个输入流对象fis,并且以f作为参数
04 ///使用循环语句将文本文件中的字符读出
05 public class file3
06 {
07 public static void main(String[]args)throws Exception
08 {
09 File f=new File("d:\filetest\file.txt");
10 FileInputStream fis=new FileInputStream(f);
11 char ch;
12 for(int i=0;i<f.length();i++)
13 {
14 ch=(char)fis.read();
15 System.out.print(ch);
16 }
17 fis.close();
18 }
19 }
【代码说明】仔细分析上面的程序段,第9行建立一个目标对象,这里的目标对象是一个记事本文件。接着第10行建立一个输入流对象,利用这个输入流对象的“read()”方法,读取目标对象中的数据,最后第17行将这个流关闭。由于是读数据,所以这个目标对象必须已经存在。这个过程可以使用一个图来表示,如图15.1所示。
图 15.1 数据输入流模拟图
【运行效果】
addbcnhhvbvbbvnbvncxzxvdfhhtrrgregfdsgdsfdhjxccbnh
说明 读者机器上如果没有file.txt文件,则会报错。先手动创建此文件,文件内容与上述结果相同。
【实例15.5】下面再看一个有关输入流对象的实例。
01 import java.io.*;
02 ///创建一个文件类f
03 ///创建一个输入流对象fis,并且以f作为参数
04 ///将所有的字节都保存到一个字节数组b中
05 ///使用循环语句将b中的字符读出
06 public class file4
07 {
08 public static void main(String[]args)throws Exception
09 {
10 File f=new File("d:\filetest\file.txt");
11 FileInputStream fis=new FileInputStream(f);
12 byte[]b=new byte[(int)f.length()];
13 fis.read(b);
14 for(int i=0;i<f.length();i++)
15 {
16 System.out.print((char)b[i]);
17 }
18 fis.close();
19 }
20 }
【代码说明】第10行创建一个目标对象,其是file.txt文件,第11行创建一个读取数据流对象fis,第13行开始读取目标对象的数据。不要忘记第18行关闭读取流。
【运行效果】
addbcnhhvbvbbvnbvncxzxvdfhhtrrgregfdsgdsfdhjxccbnh