为什么read()方法在EOF返回-1?

时间:2017-01-10 03:48:12

标签: java ascii eof

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

  

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

以下InputStream.read()中定义的public abstract int read() throws IOException真实定义:

  

“{{1}}

     

从输入流中读取下一个数据字节。值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。“

请注意,没有提及ASCII。

  

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

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

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

  

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

各种各样的事情。实际上,应用程序选择使用它的任何内容。

  

如果文件是空白的(没有数据),NUL字符是否存在?

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

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

答案 1 :(得分:1)

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