fileInputStream和Scanner类

时间:2015-06-21 09:51:44

标签: java io java.util.scanner fileinputstream

我正在尝试理解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的原因是因为那个?

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

1 个答案:

答案 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。