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

Java调用DataInputStream的readLong方法为何会抛出EOFException?

问题原因

你遇到的EOFException核心原因如下:

  1. 缓冲流未刷盘就读取:代码用了BufferedOutputStream缓冲输出流,调用写入方法后数据只会存在于内存缓冲区,不会立刻写入磁盘,只有缓冲区填满、主动调用flush()或者流关闭时才会落盘。你在同一个try块内写完立刻就读,此时内容还没写到文件里,读取long需要8字节数据,文件为空自然抛出EOF异常。
  2. 路径一致性风险:输出流使用相对路径1.dat,输入流使用固定绝对路径,若项目运行的工作目录和输入流指向的目录不一致,会导致输入流读取的是不存在的文件/空文件,也会触发该异常。
解决方案

推荐两种修复方式,第二种更符合常规开发规范:

方案1:写入完成后主动刷入缓冲区

在写入操作结束后、读取操作开始前,调用输出流的flush()方法强制将缓冲区内容写入磁盘:

try (DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("1.dat")));
     DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream("C:\\Users\\Asus\\IdeaProjects\\Example\\1.dat")))){
    dataOutputStream.writeLong(123);
    dataOutputStream.writeChar('D');
    dataOutputStream.writeUTF("Hello!");
    // 新增刷盘操作
    dataOutputStream.flush();

    System.out.println(dataInputStream.readLong());
    System.out.println(dataInputStream.readChar());
    System.out.println(dataInputStream.readUTF());
} catch (IOException e) {
    e.printStackTrace();
}

方案2:拆分读写生命周期(推荐)

先完成写入流程,等输出流自动关闭(try-with-resources会自动触发刷盘和资源释放)后,再打开输入流读取,彻底避免缓冲区和资源冲突问题:

// 写入流程
try (DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("1.dat")))) {
    dataOutputStream.writeLong(123);
    dataOutputStream.writeChar('D');
    dataOutputStream.writeUTF("Hello!");
} catch (IOException e) {
    e.printStackTrace();
}

// 读取流程
try (DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream("C:\\Users\\Asus\\IdeaProjects\\Example\\1.dat")))) {
    System.out.println(dataInputStream.readLong());
    System.out.println(dataInputStream.readChar());
    System.out.println(dataInputStream.readUTF());
} catch (IOException e) {
    e.printStackTrace();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 09:24:04