Java调用DataInputStream的readLong方法为何会抛出EOFException?
问题原因
你遇到的EOFException核心原因如下:
- 缓冲流未刷盘就读取:代码用了
BufferedOutputStream缓冲输出流,调用写入方法后数据只会存在于内存缓冲区,不会立刻写入磁盘,只有缓冲区填满、主动调用flush()或者流关闭时才会落盘。你在同一个try块内写完立刻就读,此时内容还没写到文件里,读取long需要8字节数据,文件为空自然抛出EOF异常。 - 路径一致性风险:输出流使用相对路径
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
相关产品推荐
相关产品推荐

