【问题标题】:why read () method returns -1 at EOF?为什么 read() 方法在 EOF 处返回 -1?
【发布时间】:2023-10-10 08:28:01
【问题描述】:

我正在学习 java.io。在read ()方法文档中,我看到了定义:

read()方法返回输入字节的ASCII码(0-255),并在文件末尾返回-1

此外,据我所知,EOF 的 ASCII 码是26

那么,为什么 read() 方法返回 -1 而不是 26 用于 EOF。还有,返回值-1是什么意思?

还有一个问题:空字符(即NUL),ASCII码:0,是干什么用的?如果文件是空白的(即没有数据),NUL字符是否存在?

【问题讨论】:

  • 什么read() 方法?哪个班?
  • EOF 字符是...有问题的。它实际上不再用于标记文件的结尾。否则,如果您需要 26 号会怎样?
  • 你在哪里找到那句话?它肯定不是 InputStream.read() 的 javadoc,因为它读取的是字节,而不是 ASCII 字符。请链接到您的来源,因为它可能是伪造的/有缺陷的。

标签: java ascii eof


【解决方案1】:

我看到了定义:“read()方法返回输入字节的ASCII码(0-255)并在文件末尾返回-1”

这个定义是不正确的。 read() 方法不返回 ASCII。它返回字节,并且不对它们进行解释。对于二进制文件,绝对不是ASCII码。

这是InputStream.read()真实定义...在javadoc 中定义:

"public abstract int read() throws IOException

从输入流中读取数据的下一个字节。值字节以 int 形式返回,范围为 0 到 255。如果由于到达流的末尾而没有可用的字节,则返回值 -1。"

请注意这里没有提到 ASCII。


而且,据我所知,EOF的ASCII码是26。

实际上,没有表示 EOF 的 ASCII 字符。代码 26 (CTRL-Z) 是 ASCII SUB 字符。 在键盘输入中用于表示 Windows 上的 EOF,但在其他上下文中不使用。事实上,在 Mac OS 和 Linux 上,ASCII 代码 4 (CTRL-D) 可以达到这个目的。

无论如何,从 0 到 255 的所有无符号字节值都是可能出现在文件中的有效数据值。因此有必要使用不同的值来表示 EOF。


还有一个问题:空字符(NUL),ASCII码:0,是干什么用的?

各种各样的东西。实际上,应用程序选择将其用于的任何东西。

如果文件为空(无数据),NUL字符是否存在?

NUL 字符不代表空文件或文件结尾。

如果文件没有数据,则其长度为零。文件长度是文件元数据的一部分,就像文件名、所有者和组、权限、创建时间戳等一样。

【讨论】:

    【解决方案2】:

    从文件(在“现代文件”系统上)读取的byte 值的有效范围是 8 位(也就是说,它不是必要 ascii 编码的,它可能是二进制)。由于可能会返回从0255 的任何值,因此有必要以某种方式指示文件的结尾。在处理小文件时,您可能更喜欢java.nio(通常)提供的类和方法以及Files(特别是)提供的读取方法。

    【讨论】: