17

我正在使用 DataInputStream 并且有一个关于 EOFExceptions 的问题。

根据java文档:

表示输入期间意外到达文件结尾或流结尾。

此异常主要由数据输入流用来表示流结束。请注意,许多其他输入操作在流结束时返回一个特殊值,而不是引发异常。

这是否意味着当生成 EOFException 时,流将永远不会再次打开?这是否意味着您永远不应该期望从中获得更多数据?

如果输出流连接到输入流并调用了 outputstream.close(),输入流会收到 EOFException 还是 IOException?

IOException 描述为:

表示发生了某种 I/O 异常。此类是由失败或中断的 I/O 操作产生的一般异常类。

输出流的关闭是否会在数据输入流端产生 EOFException 或 IOException?

4

5 回答 5

7

关键词出乎意料。

如果您使用 DataInputStream 并读取一个 4 字节整数,但流中只剩下 3 个字节,您将收到 EOFException。

但是如果你在流的末尾调用 read() 你只会得到 -1 并且没有例外。

于 2009-03-19T22:44:07.570 回答
7

当您到达流的末尾(文件末尾或对等方关闭连接)时:

  • read()返回 -1
  • readLine()返回空
  • readXXX()对于任何其他 X throws EOFException

流仍处于打开状态,但您应该停止读取并关闭它。

于 2014-01-04T00:36:07.637 回答
4

回答您问题的另一部分:是的,EOF 意味着不会在流上看到更多数据;你应该关闭它。

于 2009-03-19T22:48:29.620 回答
3

EOFException 是 IOException 的子类。如果您尝试从流中读取并且没有要读取的数据(例如,因为您的 DataInputStream 被包裹在 FileInputStream 周围并且您尝试读取的字节数多于文件中剩余的字节数),它将被抛出。

于 2009-03-19T22:45:10.250 回答
0

EOFException is thrown:

  1. if there is no data in a STREAM but you are trying to read...eg read methods of chain streams like DataInputStream, ObjectInputStream, RandomAccessFile throw EOFException if they are trying to read from FileInputStream but the FileInputStream is empty
  2. or if the formats are not matching...eg if int is present and you are using readFloat() of DataInputStream
于 2010-10-13T18:00:26.267 回答