我正在尝试使用java.util.Scanner逐个字符地读取一行文件。但是我得到了这个例外“:
Exception in thread "main" java.util.InputMismatchException: For input string: "contents of my file"
at java.util.Scanner.nextByte(Scanner.java:1861)
at java.util.Scanner.nextByte(Scanner.java:1814)
at p008.main(p008.java:18) <-- line where I do scanner.nextByte()
这是我的代码:
public static void main(String[] args) throws FileNotFoundException {
File source = new File("file.txt");
Scanner scanner = new Scanner(source);
while(scanner.hasNext()) {
System.out.println((char)scanner.nextByte());
}
scanner.close()
}
有没有人对我可能做错了什么有任何想法?
编辑:我意识到我写了hasNext()而不是hasNextByte()。但是,如果我这样做,它不打印任何东西。
答案 0 :(得分:10)
为什么你想要使用扫描仪逐字节读取文件?这就像用手推车搬运口袋一样。 (如果你真的需要一个独轮车换口袋,请告诉我,这样我才能成为你的朋友)。
但严重的是:类InputStream
从文件中读取字节,简单可靠,并且不执行任何操作。
类scanner
最近被引入到Java API中,因此教科书示例可以将数据从文件中提取出来,而不是通常使用new BufferedReader(new InputStream)
级联所涉及的痛苦。它的专长是从自由格式的输入文件中输入数字和字符串。 nextByte()
方法实际上从输入流中读取一个或几个十进制数字(如果它们在那里)并将扫描的数字转换为单个字节值。
如果您正在读取字节,为什么要将它们输出为char
?字节不是而不是字符,并且在某些地方蛮力互换会失败。如果你想看到那些字节的值,按原样打印它们,你会看到0到255之间的小整数。
如果您想从文件中读取char
,FileReader
就是您的课程。
答案 1 :(得分:2)
扫描程序用于解析文本数据 - 其nextByte()
方法要求输入由数字组成(可能以符号开头)。
如果您实际阅读的是文本数据,则可能需要FileReader
;如果是二进制数据,则可能需要FileInputStream
。或者如果您正在阅读具有特定字符编码的文本,则FileInputStream
包含在InputStreamReader
中(不幸的是,FileReader
不允许您指定编码但隐式使用平台默认编码,这往往不好)。
答案 2 :(得分:1)
排查Scanner
后,请检查underlying I/O errors:
if(scanner.ioException() != null) {
throw scanner.ioException();
}
虽然我和其他人在一起 - 但这可能不适合这份工作。如果您想要字节输入,请使用InputStream
(在本例中为FileInputStream
)。如果您想要输入字符,请使用Reader
(例如InputStreamReader
)。
答案 3 :(得分:1)
Scanner
完全是为了阅读分隔文本(请参阅the docs)。
nextByte
将继续读取,直到它到达您指定的任何分隔符(默认为空格),然后尝试将该字符串转换为字节。
因此,如果您在文件中有123 456
,则对nextByte
的一次调用将返回123
,而不是49
(1
字符的十进制值)。
如果要逐字节读取,可以使用FileInputStream
。