9

そのため、Scannerクラスを使用してファイルからコンテンツを読み取るときに、興味深い問題が発生しました。基本的に、私はいくつかの精度メトリックを計算するために、ディレクトリから解析アプリケーションによって生成されたいくつかの出力ファイルを読み取ろうとしています。

基本的に、私のコードはディレクトリ内の各ファイルをウォークスルーし、スキャナーでそれらを開いてコンテンツを処理します。何らかの理由で、いくつかのファイル(すべてUTF-8でエンコードされている)がスキャナーによって読み取られていませんでした。ファイルが空ではなかったとしても、scanner.hasNextLine()は最初の呼び出しでfalseを返します(デバッガーを開いてこれを観察しました)。毎回Fileオブジェクトを使用してスキャナーを直接初期化していました(ファイルObjectsは正常に作成されました)。すなわち:

    File file = new File(pathName);
    ...
    Scanner scanner = new Scanner(file);

私はいくつかのことを試しましたが、最終的には次の方法でスキャナーを初期化することでこの問題を修正することができました。

    Scanner scanner = new Scanner(new FileInputStream(file));

問題を解決できてうれしいですが、以前に問題を引き起こした可能性があることについては、まだ興味があります。何か案は?本当にありがとう!

4

2 に答える 2

5

Java 6u23のScanner.javaソースによると、新しい行が次のように検出されます。

private static final String LINE_SEPARATOR_PATTERN = 
                                       "\r\n|[\n\r???]";
private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$";

したがって、次の正規表現を、読み取られなかったファイルのコンテンツと一致させることができるかどうかを確認できます。

.*(\r\n|[\n\r???])|.+$

また、例外が発生したかどうかを確認します。

更新: これは私を興味深くさせ、私は答えを探しました。あなたの質問はすでにここで尋ねられ、解決されたようです: Java Scanner(File)は誤動作していますが、Scanner(FIleInputStream)は常に同じファイルで動作します

要約すると、ASCII以外の文字についてです。これらの文字は、スキャナーをFileとFileInputStreamのどちらで初期化するかによって動作が異なります。

于 2012-12-14T16:06:31.367 に答える
0

ファイルを読み取った後、常にスキャナーを閉じるかどうかを確認しようと思います。また、hasNextLine()とnextLine()のみを呼び出しますか、それともそのスキャナーで別のnextXXX()メソッドを呼び出しますか?

于 2012-12-14T16:01:01.340 に答える