5

java.util.Scannerを使用して1行のファイルを1文字ずつ読み取ろうとしています。ただし、この例外が発生します」:

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

私が間違っているかもしれないことについて誰かが何か考えを持っていますか?

編集:hasNextByte()の代わりにhasNext()を書いたことに気づきました。ただし、そうしても何も出力されません。

4

4 に答える 4

11

いったいなぜ、スキャナーを使用してファイルをバイト単位で読み取る必要があるのでしょうか。それは手押し車を使って小銭を運ぶようなものです。(ポケットチェンジのために手押し車が本当に必要な場合は、私に知らせてください。私はあなたの友達になります)。

しかし真剣に: クラスInputStreamはファイルからバイトを単純かつ確実に読み取り、他には何もしません。

Classscannerは最近 Java API に導入されたので、教科書の例では、 のカスケードを通常使用する場合よりも簡単にファイルからデータを引き出すことができますnew BufferedReader(new InputStream)。その専門は、自由形式の入力ファイルから数値と文字列を入力することです。このnextByte()メソッドは、実際には入力ストリームから 1 桁または数桁の 10 進数を読み取り (存在する場合)、スキャンされた数値を 1 バイト値に変換します。

また、バイトを読み取っている場合、なぜそれらをchars として出力したいのでしょうか? バイトはchar ではなく、力ずくの相互変換はいくつかの場所で失敗します。これらのバイトの値を確認したい場合は、それらをそのまま印刷すると、0 から 255 までの小さな整数が表示されます。

charファイルから sを読み取りたい場合FileReaderは、クラスが最適です。

于 2010-01-11T00:22:30.023 に答える
3

Scanner はテキストデータを解析nextByte()するためのものです - そのメソッドは、入力が数字で構成されていることを期待しています (おそらく記号が前に付いています)。

FileReader実際にテキスト データを読み取る場合は a を、FileInputStreamバイナリ データを読み取る場合はa を使用することをお勧めします。または、特定の文字エンコーディングでテキストを読んでいる場合は、FileInputStreamラップされます (残念ながら、エンコーディングを指定することはできませんが、プラットフォームのデフォルトのエンコーディングを暗黙的に使用するため、多くの場合、適切ではありません)。InputStreamReaderFileReader

于 2010-01-11T00:23:44.470 に答える
1

トラブルシューティングを行うときは、根本的な I/O エラーをScanner確認します。

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

私は他の人たちと一緒ですが、おそらくこのクラスはこの仕事に適したクラスではありません。バイト入力が必要な場合は、InputStream(この場合はFileInputStream) を使用します。char 入力が必要な場合は、Reader(eg InputStreamReader) を使用します。

于 2010-01-11T10:53:41.540 に答える
1

Scanner区切られたテキストを読むことがすべてです(ドキュメントを参照)。

nextByte指定した区切り文字(デフォルトでは空白)に到達するまで読み取りを続け、その文字列をバイトに変換しようとします。

したがって123 456、ファイルにある場合、 を 1 回呼び出すと、 (文字の 10 進値)ではなくnextByteが返されます。123491


バイトごとに読み取りたい場合は、 を使用できますFileInputStream

于 2015-08-15T20:22:36.733 に答える