Java FileInputStream和FileOutputStream的用法(附带实例)
在 Java 中,文件输入流(FileInputStream)是很常见的一种字节输入流,如下图所示。

图 1 文件输入流
FileInputStream 用于以字节的形式来读取文件,这些文件可以是 Word 文件、文本文件、Excel 文件或图片文件等。FileInputStream 类的父类是 InputStream 类。
我们可以通过下面的两种方式来创建 FileInputStream 对象,其不同的地方在于传入的参数类型,一个是 String 类型,另一个是 File 类型。
下面我们通过一个示例来看看如何使用 FileInputStream 来读取文件内容。我们先在 D 盘创建一个 test.txt 文件,具体文件路径为“D:/test.txt”,在文件中添加如下内容:
注意这个过程需要尝试捕获异常 FileNotFoundException 和 IOException,这里异常的触发条件包括找不到文件、没有对文件的读写权限等。最终还要用 finally 来确保关闭文件输入流并释放占用的相关资源。
将上面的示例稍作改动,通过循环“while ((value = fis.read()) != -1)”来实现对整个文件的读取,如下面的实例所示,不断通过 read() 方法读取下 1 字节,直到值为 -1 时停止循环。

图 2 文件输出流
FileOutputStream 与 FileInputstream 对应,两者的数据流转方向相反。FileOutputStream 类的父类是 OutputStream 类。
有 4 种构造方法可以创建 FileOutputStream 对象:
此外还可以另外传入一个 boolean 类型的值,如果该值为 true,表示写入的内容追加到文件末尾,而如果为 false,则表示清空原来文件的内容从头开始写入。
下面实例展示了如何使用 write() 方法写入字节数据:
代码执行结果如下图所示:

图 3 文件内容
我们对上面的示例稍加改动,先清空“test.txt”文件中的内容,然后通过“new FileOutputStream("D:/test.txt", true)”来创建文件输出流对象,它将以追加的方式写入数据,如下面的实例程序所示。

图 4 文件内容
一个个字节写入比较烦琐,实际编程中可以选择以字节数组的形式进行写入,直接将字节数组传入 write() 方法中。字符串“abc123”可以通过 getBytes() 方法来转换成字节数组,如下面的实例代码所示,这样便可以很方便地将“abc123”写入文件中。

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