You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用循环从DataInputStream读取全部数据?Java读取报错解决

解决Java读取Data文件时的EOFException问题

嘿,我来帮你搞定这个问题~你现在遇到的情况很典型:代码能输出文件里的内容,但最后总会抛出java.io.EOFException,对吧?

问题根源

你写的do-while循环逻辑有个小问题:DataInputStream的readUTF()方法不会在文件末尾返回null,当它尝试读取下一段UTF数据但已经到文件结尾时,会直接抛出EOFException。这就导致你的循环还没走到while (!name.equals(null))的判断,就先触发异常了。

修复方案

我们可以通过捕获EOFException来判断文件已经读完,同时用try-with-resources语法自动管理流资源(不用手动调用close(),还能避免资源泄漏)。修改后的代码如下:

public static void main(String[] args) {
    // try-with-resources会自动关闭dis流
    try (DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"))) {
        String name;
        while (true) {
            try {
                name = dis.readUTF();
                System.out.println(name);
            } catch (EOFException e) {
                // 捕获到EOFException,说明已经读到文件末尾,跳出循环
                break;
            }
        }
    } catch (IOException e) {
        // 处理其他IO异常(比如文件找不到等)
        e.printStackTrace();
    }
}

额外说明

  • try-with-resources是Java 7及以上版本的特性,它会在代码块结束后自动关闭实现了AutoCloseable接口的资源,这里的DataInputStream就符合要求,比手动调用close()更安全。
  • 除了捕获异常的方式,也可以提前判断文件里还有没有可读数据,但available()方法并不完全可靠(它返回的是当前可读取的字节数,不一定是整个文件剩余的字节数),所以捕获EOFException是更稳妥的做法。

内容的提问来源于stack exchange,提问作者Paweł

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:03:11