首页 > 编程笔记 > Java笔记 阅读:15

Java FileInputStream和FileOutputStream的用法(附带实例)

在 Java 中,文件输入流(FileInputStream)是很常见的一种字节输入流,如下图所示。


图 1 文件输入流

FileInputStream 用于以字节的形式来读取文件,这些文件可以是 Word 文件、文本文件、Excel 文件或图片文件等。FileInputStream 类的父类是 InputStream 类。

我们可以通过下面的两种方式来创建 FileInputStream 对象,其不同的地方在于传入的参数类型,一个是 String 类型,另一个是 File 类型。
FileInputStream(String path)
FileInputStream(File file)
这里的 String 值必须是一个合法的文件路径,它可以是绝对路径也可以是相对路径,比如“new FileInputStream("D:/test.txt")”。

下面我们通过一个示例来看看如何使用 FileInputStream 来读取文件内容。我们先在 D 盘创建一个 test.txt 文件,具体文件路径为“D:/test.txt”,在文件中添加如下内容:
12345
abc
6789
接着的操作如下面的实例所示:
public class IOtest {
     public static void main(String[] args) throws IOException {
          FileInputStream fis = null;
          try {
               fis = new FileInputStream("D:/test.txt");
               int value = fis.read();
               System.out.println(value);
               System.out.println((char) value);
          } catch (FileNotFoundException e) {
               e.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          } finally {
               if (fis != null)
                    fis.close();
          }
     }
}
通过 read() 方法来读取文件,每调用一次方法读取 1 字节。我们先读取 1 字节,输出的值分别为“49”和“1”,这是因为文件中的字符“1”是以 ASCII 编码进行存储的,对应的字节值为“49”,所以通过“(char) value”可以转换成真实值。

注意这个过程需要尝试捕获异常 FileNotFoundException 和 IOException,这里异常的触发条件包括找不到文件、没有对文件的读写权限等。最终还要用 finally 来确保关闭文件输入流并释放占用的相关资源。

将上面的示例稍作改动,通过循环“while ((value = fis.read()) != -1)”来实现对整个文件的读取,如下面的实例所示,不断通过 read() 方法读取下 1 字节,直到值为 -1 时停止循环。
public class IOtest {
     public static void main(String[] args) throws IOException {
          FileInputStream fis = null;
          try {
               fis = new FileInputStream("D:/test.txt");
               int value = 0;
               while ((value = fis.read()) != -1) {
                    System.out.print((char) value);
               }
          } catch (FileNotFoundException e) {
               e.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          } finally {
               if (fis != null)
                    fis.close();
          }
    }
}
输出结果如下,可以看到已经成功读取指定文件的内容:

12345
abc
6789

Java FileOutputStream文件输出流

文件输出流(FileOutputStream)用于以字节形式将数据写入文件,如下图所示。


图 2 文件输出流

FileOutputStream 与 FileInputstream 对应,两者的数据流转方向相反。FileOutputStream 类的父类是 OutputStream 类。

有 4 种构造方法可以创建 FileOutputStream 对象:
FileOutputStream(String path)
FileOutputStream(String path, boolean append)
FileOutputStream(File file)
FileOutputStream(File file, boolean append)
构造方法可以传入 String 类型或 File 类型的参数,它们对应的路径值必须是一个合法的文件路径,如“new FileOutputStream("D:/test.txt")”。如果输出时指定的文件不存在会自动创建该文件。

此外还可以另外传入一个 boolean 类型的值,如果该值为 true,表示写入的内容追加到文件末尾,而如果为 false,则表示清空原来文件的内容从头开始写入。

下面实例展示了如何使用 write() 方法写入字节数据:
public class IOtest {
    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("D:/test.txt");
            os.write('a');
            os.write('b');
            os.write('c');
            os.write('1');
            os.write('2');
            os.write('3');
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            os.close();
        }
    }
}
首先指定“D:/test.txt”文件路径创建 FileOutputStream 对象,然后调用 6 次 write() 方法分别将 a、b、c、1、2、3 写入文件。为了保证文件输出流的关闭,必须要在 finally 块中调用 close() 方法。

代码执行结果如下图所示:


图 3 文件内容

我们对上面的示例稍加改动,先清空“test.txt”文件中的内容,然后通过“new FileOutputStream("D:/test.txt", true)”来创建文件输出流对象,它将以追加的方式写入数据,如下面的实例程序所示。
public class IOtest {
    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("D:/test.txt", true);
            os.write('a');
            os.write('b');
            os.write('c');
            os.write('1');
            os.write('2');
            os.write('3');
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            os.close();
        }
    }
}
此时如果我们执行三次程序,将写入三次“abc123”,最终结果如下图所示。


图 4 文件内容

一个个字节写入比较烦琐,实际编程中可以选择以字节数组的形式进行写入,直接将字节数组传入 write() 方法中。字符串“abc123”可以通过 getBytes() 方法来转换成字节数组,如下面的实例代码所示,这样便可以很方便地将“abc123”写入文件中。
public class IOtest {
    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("D:/test.txt");
            os.write("abc123".getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            os.close();
        }
    }
}

相关文章