我正在尝试理解Scanner.nextByte()
和FileInputStream.read()
之间的区别。我读过类似的主题,但我没有找到问题的答案。在主题中提出了类似的问题:Scanner vs FileInputStream
让我说出我理解的内容:
假设.txt
文件包含
1
然后,
FileInputStream.read()
将返回49
Scanner.nextByte()
将返回1
如果.txt
文件包含
a
FileInputStream.read()
将返回97。
Scanner.nextByte()
会抛出java.util.InputMismatchException
。
在我给出链接的答案中,它说:
FileInputStream.read()
将1作为一个字节进行评估,然后返回它 值:49。Scanner.nextByte()
将读取1并尝试评估 它作为基数10的整数正则表达式,并给你:1。
FileInputStream.read()
将a评估为一个字节,并返回它 值:97。Scanner.nextByte()
将读取a并尝试评估 它作为基数10的整数正则表达式,并抛出一个java.util.InputMismatchException
。
但我不明白他们的意思。你能用更清晰的例子用简单的词语解释这些词吗?我看了ASCII表,字符1对应49. FileInputStream.read()
返回49的原因是因为那个?
我完全糊涂了。请用简单的话解释我。
答案 0 :(得分:2)
文件包含字节。 FileInputStream读取这些字节。因此,如果一个文件包含一个值为49的字节,则stream.read()将返回49.如果该文件包含两个相同的字节49,则调用read()两次将返回49,然后返回49.
字符如' a',' 1'或者' Z'可以存储在文件中。要存储在文件中,首先必须将它们转换为字节,因为它包含的是哪些文件。有多种方法(称为"字符编码")将字符转换为字节。其中一些(如ASCII,ISO-8859-1或UTF-8)转换角色' 1'进入字节49。
扫描程序从文件中读取字符。因此它将文件中的字节转换为字符(使用字符编码,但在另一个方向:从字节到字符)。一些字符序列形成十进制数字,例如' 123' -5265'或' 1'。有些人不喜欢' abc'。
当您在扫描仪上调用nextByte()
时,您要求扫描仪读取下一个字符序列(直到下一个空白区域或直到文件末尾,如果没有空格),然后检查是否此字符序列表示有效的十进制数,并检查此十进制数是否适合一个字节(即,是-128到127之间的数字)。如果是,则将字符序列解析为十进制数,存储在一个字节中,然后返回。
因此,如果文件包含字节49两次,则nextByte()读取和解析的字符序列将是' 11'这将被转换为字节11。