何时会在JAVA的流中发生EOFException

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

根据java文档:

表示在输入期间意外到达文件末尾或流末尾的信号。

此exception主要由数据输入流用于信号流的结束。 请注意,许多其他输入操作在流的末尾返回特殊值而不是抛出exception。

这是否意味着当生成EOFException时,流不会再次打开? 这是否意味着你永远不会期待它的更多数据?

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

IOException被描述为:

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

输出流上的close是否会在datainputstream端产生EOFException或IOException?

关键词是意外的。

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

但是如果你在流的末尾调用read(),你将只返回-1并且没有exception。

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

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

流仍然是打开的,但您应该停止读取并关闭它。

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

EOFException是IOException的子类。 如果您尝试从流中读取并且没有更多数据需要读取(例如,因为您的DataInputStream包裹在FileInputStream中并且您尝试读取的文件比文件中剩余的更多),则会抛出它。

抛出EOFException:

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