【问题标题】:When will an EOFException occur in JAVA's streamsJAVA 的流中何时会出现 EOFException
【发布时间】:2010-10-14 10:34:56
【问题描述】:

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

根据 java 文档:

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

这个异常主要被数据使用 输入流到流结束的信号。 请注意,许多其他输入操作 在结束时返回一个特殊值 流而不是抛出 例外。

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

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

一个 IOException 被描述为:

表示某些 I/O 异常 排序已发生。这堂课是 产生的一般类异常 由于失败或中断的 I/O 操作。

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

【问题讨论】:

  • 供其他人参考:this answer 解释了为什么抛出 EOFException 而不是返回特殊值的方法。

标签: java input stream eofexception


【解决方案1】:

关键字出乎意料。

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

但是如果你在流结束时调用 read() 你只会得到 -1 并且没有异常。

【讨论】:

  • 答案只会增加混乱。 read() 返回 -1,readLine() 返回 null,readXXX() 为任何其他 X 抛出 EOFException。
  • 这里没有“关键词”。
【解决方案2】:

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

  • read() 返回 -1
  • readLine() 返回 null
  • readXXX() 用于任何其他 X 抛出 EOFException

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 但是 datainputstream 怎么知道没有更多的字节来了?换句话说,仅仅因为我读到并且没有看到任何数据并不意味着文件(在文件输入流中)已经结束。可能只是字节还没有到达。我在文档中没有看到 FileInputStream 返回 EOF。
      • 有了文件,您就知道何时走到了尽头。包装后的 FileInputStream 将引发 EOFException,该异常由 DataInputStream 传播到您的代码。
      • @SimonNickerson +1 但您的评论不正确。 FileInputStream 不会抛出 EOFException。它的 read() 方法返回 -1。 DataInputStream 看到并抛出 EOFException。
      【解决方案5】:

      抛出EOFException:

      1. 如果 STREAM 中没有数据但您正在尝试读取...例如,如果 DataInputStream、ObjectInputStream、RandomAccessFile 等链流的读取方法尝试从 FileInputStream 读取,则抛出 EOFException 但FileInputStream 为空
      2. 或者如果格式不匹配...例如如果 int 存在并且您正在使用 DataInputStream 的 readFloat()

      【讨论】:

      • 第 2 点不正确。显然你还没有尝试过。你描述的是不可能的。 DataInputStream 中没有要测试的流的格式信息。当流不为空时抛出 EOFException 也是不合理的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多