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。
我正在尝试了解 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 ajava.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。