位置:首页 > Java > 字节流读写文件的方法与实现详解

字节流读写文件的方法与实现详解

时间:2026-08-17  |  作者:白桃企划师  |  阅读:0

文件读写与字节流概述

计算机里的数据,大多最终都会落到硬盘文件中。对文件数据进行操作,本身就是开发里非常常见的一件事。

更具体一点,最常见的场景无非就是:从一个文件里把数据读出来,再把这些数据写到另一个文件里,这整个过程就是文件的读写。

围绕这类操作,JDK 也专门提供了两个类,分别是 FileInputStreamFileOutputStream

FileInputStream:读取文件数据

FileInputStream是InputStream的子类。它是操作文件的字节输入流,专门用于读取文件中的数据。

由于从文件读取数据是重复的操作,因此需要通过循环语句来实现数据的持续读取。

读取文件示例

接下来通过一个案例来实现字节流对文件数据的读取。

  • 首先在Eclipse项目的根目录下创建一个文本文件test.txt。
  • 在文件中输入内容“hello”并保存。
  • 然后创建一个读取文本文件的类,具体代码如文件1所示。

文件1 Example01.ja va

 1    import ja va.io.*;
 2    public class Example01 {
 3        public static void main(String[] args) throws Exception {
 4            // 创建一个文件字节输入流来读取文件
 5            FileInputStream in = new FileInputStream("test.txt");
 6            // 定义一个int类型的变量b
 7            int b = 0;
 8            // 通过循环来读取文件,当返回值为-1结束循环
 9            while((b=in.read()) != -1){
 10                System.out.println(b); 
 11            }
 12            // 关闭流
 13            in.close();
 14        }
 15    }

运行结果如图1所示。

字节流读写文件的方法与实现详解_wishdown.com

图1 运行结果

运行结果说明

文件1中,创建的字节流对象FileInputStream通过read()方法将当前项目中的文件“test.txt”中的数据读取并打印。

从图7-5中的运行结果可以看出,结果分别为104、101、108、108和111,这与test.txt文件中显示效果不太一样。

这是因为读取到硬盘上的文件是以字节的形式存在的。在“test.txt”文件中,字符‘h’、‘e’、‘l’、‘l’、‘o’各占一个字节。

因此,最终结果显示的是文件“test.txt”中的5个字节所对应的ASCII码值。

读取文件的前提条件

有一点一定要提前说明:读取文件数据时,前提是目标文件已经存在于对应目录中,而且当前程序具备可读权限。

只要这两个条件有一个不满足,就会抛出 ja va.io.FileNotFoundException,也就是常说的“文件找不到”异常。

就拿上面的例子来说,如果没有在项目目录下创建名为“test.txt”的文本文件,那么程序运行后就会出现图2所示的异常。

字节流读写文件的方法与实现详解_wishdown.com

图2 运行结果

FileOutputStream:写入文件数据

与FileInputStream对应的是FileOutputStream。FileOutputStream是OutputStream的子类,它是操作文件的字节输出流,专门用于把数据写入文件。

接下来通过一个案例来演示如何将数据写入文件,如文件2所示。

文件2 Example02.ja va

 1    import ja va.io.*;
 1    public class Example02 {
 2        public static void main(String[] args) throws Exception {
 3            // 创建文件输出流对象,并指定输出文件名称
 4            FileOutputStream out = new FileOutputStream("out.txt");
 5            // 定义一个字符串
 6            String str = "hello";
 7            // 将字符串转换为字节数组进行写入操作
 8            out.write(str.getBytes());
 9            // 关闭流
 10            out.close();
 11        }
 12    }

程序运行后,会在项目当前根目录下生成一个新的文本文件out.txt。

运行程序后,该文件可能不会立刻显示。此时使用鼠标右击项目,在弹出窗口中,单击“Refresh”,对项目进行刷新即可。

打开此文件,会看到如图3所示的内容。

字节流读写文件的方法与实现详解_wishdown.com

图3 out.txt

从图3可以看出,通过FileOutputStream写数据时,自动创建了文件out.txt,并将自定义的字符串内容写入到了目标文件。

追加写入文件

需要注意的是,如果是通过FileOutputStream向一个已经存在的文件中写入数据,那么该文件中的数据首先会被清空,再写入新的数据。

若希望在已存在的文件内容之后追加新内容,则可使用FileOutputStream的构造函数FileOutputStream(String fileName, boolean append)来创建文件输出流对象,并把append 参数的值设置为true。

接下来通过一个案例来演示如何将数据追加到out.txt文件末尾,如文件3所示。

文件3 Example03.ja va

 1    import ja va.io.*;
 2    public class Example03 {
 3        public static void main(String[] args) throws Exception {
 4            // 创建文件输出流对象,并指定输出文件名称
 5            FileOutputStream out = new FileOutputStream("out.txt",true);
 6            // 定义一个字符串
 7            String str = " world";
 8            // 将字符串转换为字节数组进行写入操作
 9             out.write(str.getBytes());        
 10            out.close();
 11        }
 12    }

程序运行后,查看项目当前目录下的文件“out.txt”,如图4所示。

字节流读写文件的方法与实现详解_wishdown.com

图4 out.txt

从图4可以看出,程序通过字节输出流对象向文件“out.txt”写入“ world”后,并没有将文件之前的数据清空,而是将新写入的数据追加到了文件的末尾。

关闭流与异常处理

由于I/O流在进行数据读写操作时会出现异常,为了代码的简洁,在上面的程序中使用了throws关键字将异常抛出。

然而一旦遇到IO异常,I/O流的close()方法将无法执行,流对象所占用的系统资源将不能够释放。

因此,为了保证I/O流的close()方法一定执行,通常会将关闭流的操作写在finally代码块中。具体代码如下所示:

finally{
    try{
        if(in!=null)              // 如果in不为空,关闭输入流 
            in.close();
    }catch(Exception e){
        e.printStackTrace();
    }
    try{
        if(out!=null)             // 如果out不为空,关闭输出流
            out.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多