15.4.5 使用文件字节输出流输出文件
“FileOutputStream”类与超类“OutputStream”类有点相似,其实“FileOutputStream”类就是“OutputStream”的子类,并且不是一个抽象类,这样就可以利用“FileOutputStream”类的对象来使用前面的方法。
下面看看如何构造一个“FileOutputStream”类的对象,必须要用到类的构造器。表15.4是“FileOutputStream”类的构造器种类。
【实例15.6】下面将通过一个有关输出流对象的实例,熟悉它的用法。
01 import java.io.*;
02 ///创建一个文件类对象f
03 ///创建一个文件输出流对象fos
04 ///使用循环语句往f中写入数据
05 public class file5
06 {
07 public static void main(String[]args)throws Exception
08 {
09 File f=new File("d:\filetest\file.txt");
10 FileOutputStream fos=new FileOutputStream(f);
11 for(int i=’a’;i<=’z’;i++)
12 {
13 fos.write(i);
14 }
15 fos.close();
16 }
17 }
【代码说明】第9行创建目标对象,不管file.txt中有没有内容。第10行创建输出流对象fos,第11~14行输出26个小写的英文字母。
【运行效果】没有运行结果,但在file.txt中发现了刚才程序自动输入的数据,是26个小写的英文字母。
图 15.2 数据输出流模拟图
图15.2演示了输出流操作数据的过程。
【实例15.7】下面演示如何将输入流和输出流结合在一起使用。
01 import java.io.*;
02 ///创建一个文件类对象f
03 ///创建一个文件类对象f1
04 ///创建一个文件输入流对象fis
05 ///创建一个文件输出流对象fos
06 ///使用字节数组将f中的数据读出
07 ///使用循环语句将字节数组中的数据往f中写
08 public class file6
09 {
10 public static void main(String[]args)throws Exception
11 {File f=new File("d:\filetest\file.txt");
12 File f1=new File("d:\filetest\file2.txt");
13 FileInputStream fis=new FileInputStream(f);
14 FileOutputStream fos=new FileOutputStream(f1);
15 byte[]b=new byte[(int)f.length()];
16 fis.read(b);
17 for(int i=0;i<f.length();i++)
18 {
19 fos.write(b[i]);
20 }
21 fis.close();
22 fos.close();
23 }
24 }
【代码说明】第13行创建的是输入流对象,从file.txt中读取数据。第14行创建的是输出流对象,往file2.txt中输出对象。第21~22行关闭输入流和输出流。
【运行效果】上面程序最后的结果就是,在新建的文本文件“file2.txt”中,输入了从文本文件“file.txt”中读取的数据。运行步骤是,先利用输入流从目标对象中读取数据,再利用输出流对象将这些数据写到新的目标对象中。下面通过模拟图15.3,让读者对上一个程序的运行过程看得更清晰。
图 15.3 输入流和输出流模拟图