fileInputStream 和 Scanner 之间差异背后的逻辑 类

the logic behind the diffrerence between fileInputStream and Scanner classes

我正在尝试了解 Scanner.nextByte()FileInputStream.read() 之间的区别。我阅读了类似的主题,但没有找到问题的答案。主题中提出了类似的问题:Scanner vs FileInputStream

说说我的理解吧:

假设 .txt 文件包含

1

那么, FileInputStream.read() 将 return 49

Scanner.nextByte() 将 return 1

如果 .txt 文件包含

a

FileInputStream.read() 将 return 97.

Scanner.nextByte() 将抛出 java.util.InputMismatchException.

在我给link的答案中说:

FileInputStream.read() will evaluate the 1 as a byte, and return its value: 49. Scanner.nextByte() will read the 1 and try to evaluate it as an integer regular expression of radix 10, and give you: 1.

FileInputStream.read() will evaluate the a as a byte, and return its value: 97. Scanner.nextByte() will read the a and try to evaluate it as an integer regular expression of radix 10, and throw a java.util.InputMismatchException.

但我不明白他们到底是什么意思。你能用更清楚的例子用简单的词来解释这些词吗?我看了一下ASCII table, 字符1对应49. FileInputStream.read() return 49的原因是因为那个?

我完全糊涂了。请用简单的话给我解释一下。

文件包含字节。 FileInputStream 读取这些字节。所以如果一个文件包含一个值为 49 的字节,stream.read() 将 return 49。如果文件包含两个相同的字节 49,调用 read() 两次将 return 49,然后49.

'a'、'1' 或 'Z' 等字符可以存储在文件中。要存储在文件中,首先必须将它们转换为字节,因为这就是文件所包含的内容。有多种方法(称为 "character encodings")将字符转换为字节。其中一些(如 ASCII、ISO-8859-1 或 UTF-8)将字符“1”转换为字节 49。

扫描仪从文件中读取字符。因此它将文件中的字节转换为字符(使用字符编码,但在另一个方向:从字节到字符)。一些字符序列形成十进制数,例如“123”、“-5265”或“1”。有些则没有,例如 'abc'。

当您在扫描仪上调用 nextByte() 时,您要求扫描仪读取下一个字符序列(直到下一个白色 space 或如果没有白色则直到文件末尾space),然后检查这个字符序列是否代表一个有效的十进制数,并检查这个十进制数是否适合一个字节(即 -128 和 127 之间的数字)。如果是,则字符序列被解析为十进制数,存储为一个字节,并returned.

因此,如果文件两次包含字节 49,则 nextByte() 读取和解析的字符序列将为 '11',这将被转换为字节 11。