使用java.util.Scanner逐字节读取文件

我正在尝试使用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()。 但是,如果我这样做,它不打印任何东西。

为什么你想要使用扫描仪逐字节读取文件? 这就像用手推车搬运口袋一样。 (如果你真的需要一个独轮车换口袋,请告诉我,这样我才能成为你的朋友)。

但严重的是:类InputStream简单可靠地从文件中读取字节,并且不执行任何其他操作。

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

如果您正在读取字节,为什么要将它们输出为char ? 字节不是字符,蛮力互换在某些地方会失败。 如果要查看这些字节的值,请按原样打印出来,然后您将看到0到25​​5之间的小整数。

如果要从文件中读取charFileReader就是您的类。

扫描程序用于解析文本数据 – 其nextByte()方法要求输入由数字组成(可能以符号nextByte() )。

如果您实际读取文本数据,则可能需要使用FileReader如果是二进制数据,则可能需要使用FileInputStream 。 或者如果您正在读取具有特定字符编码的文本,则包含在InputStreamReaderFileInputStream (遗憾的是, FileReader不允许您指定编码但隐式使用平台默认编码,这通常不好)。

Scanner进行故障排除时,请检查基础I / O错误 :

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

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

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

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

因此,如果文件中有123 456 ,则对nextByte一次调用将返回123 ,而不是491字符的十进制值)。


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