5

I'm trying to read a one line file character by character using java.util.Scanner. However I'm getting this exception":

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()

Here's my code:

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()
}

Does anyone have any ideas as to what I might be doing wrong?

Edit: I realized I wrote hasNext() instead of hasNextByte(). However if I do that it doesn't print out anything.

4

4 回答 4

11

为什么要使用扫描仪逐字节读取文件?这就像使用独轮车运送您的零钱一样。(如果你真的需要一辆手推车来换零钱,请告诉我,这样我就可以成为你的朋友)。

但说真的:类InputStream从文件中读取字节,简单而可靠,并且什么都不做。

scanner最近被引入 Java API,因此教科书示例可以从文件中提取数据,而不是通常使用new BufferedReader(new InputStream). 它的专长是从自由格式的输入文件中输入数字和字符串。该nextByte()方法实际上从输入流中读取一个或几个十进制数字(如果它们在那里),并将由此扫描的数字转换为单字节值。

如果您正在读取字节,为什么要将它们输出为chars?字节不是字符,在某些地方暴力转换会失败。如果您想查看这些字节的值,请将它们原样打印出来,您会看到 0 到 255 之间的小整数。

如果您想char从文件中读取 s,那么FileReader该课程适合您。

于 2010-01-11T00:22:30.023 回答
3

Scanner 用于解析文本数据 - 它的nextByte()方法期望输入由数字组成(可能前面有一个符号)。

FileReader如果您实际上正在读取文本数据,或者FileInputStream如果它是二进制数据,您可能想要使用 a 。或者FileInputStreamInputStreamReader如果您正在阅读具有特定字符编码的文本(不幸的是,FileReader不允许您指定编码,但会隐式使用平台默认编码,这通常不好)。

于 2010-01-11T00:23:44.470 回答
1

故障排除时Scanner,检查底层 I/O 错误

if(scanner.ioException() != null) {
  throw scanner.ioException();
}

虽然我和其他人在一起——这可能不是适合这份工作的课程。如果您想要字节输入,请使用InputStream(在本例中为FileInputStream)。如果要输入字符,请使用Reader(例如InputStreamReader)。

于 2010-01-11T10:53:41.540 回答
1

Scanner都是关于阅读分隔文本(请参阅文档)。

nextByte将继续阅读,直到它到达您指定的任何分隔符(默认为空格),然后尝试将该字符串转换为字节。

因此,如果您123 456在文件中,一次调用nextByte将返回123,而不是49(字符的十进制值1)。


如果要逐字节读取,可以使用FileInputStream.

于 2015-08-15T20:22:36.733 回答