Java - 为什么InputStream#read是用C风格设计的?

时间:2012-09-01 06:56:43

标签: java api io

由于Java支持异常,我认为在尝试读取输入流末尾的字节时会抛出EOFException,例如

byte read() throws EOFException, IOException

但实际上InputStream#read会返回

  

数据的下一个字节,如果到达流的末尾则为-1。

让我想起了C中的getchar但另一方面却抛出了

  

IOException:如果发生I / O错误。

为什么这样设计?

3 个答案:

答案 0 :(得分:4)

很多早期的API都不太令人满意,而且有很多讨论,设计师希望他们可以做到与众不同。

我推测这不是其中之一。抛出“EOFException”可能会鼓励程序员try读取,直到发现异常。意义异常处理将用作控制程序逻辑的一种方式,称为异常处理反模式

答案 1 :(得分:4)

它是这样设计的,因为到达EOF 通常并非特殊事件。

根据官方Java Tutorial

  

异常是在程序执行期间发生的事件   这扰乱了正常的指令流。

所以返回EOF的大部分时间都很好。

但是,有些情况下抛出异常更有意义。例如,DataInputStream类有一个名为readFully的方法,它抛出:

  

EOFException - 如果此输入流在读取所有字节之前到达结尾。

简而言之,EOFException表示在正常指示流程中返回EOF时发生破坏性事件。

答案 2 :(得分:2)

在我的拙见中,人们应该问自己,当以“正常”方式阅读流时,到达文件末尾应该被视为例外。
有一个例外,让我们知道在我们的应用程序中存在异常错误的行为,情况并非如此。 如果你看一下EOFException的javadoc,你会看到,我引用 -

  

表示在输入过程中意外地达到了文件结尾或流结束。

请注意“意外的单词,以及此javadoc在下一句中的预订。