3

Eclipseで実行する一連の単体テストがあり、すべて正常に機能します。これらは、20MBを超える非常に大きなファイルからロードされたデータに依存します。ただし、ANTから単体テストを実行すると、一部のデータがロードされていないため、テストが失敗します。何が起こるかというと、私のファイル読み取りメカニズムはファイル全体を読み取らず、900,000行のうち約10,000行を読み取った後、エラーを発生させることなく停止するだけです。

これが私のファイル読み取りコードです

    private static void initializeListWithFileContents(
        TreeMap<String, List<String>> treeMap, String fileName)
{
    File file = new File(fileName);
    Scanner scanner = null;
    int count = 0;
    try
    {

        scanner = new Scanner(file);
        while (scanner.hasNextLine())
        {
            String line = scanner.nextLine().toLowerCase().trim();      
            String[] tokens = line.split(" ");

            if (tokens.length == 3)
            {
                String key = tokens[0] + tokens[1];
                if (treeMap.containsKey(key))
                {
                    List<String> list = treeMap.get(key);
                    list.add(tokens[2]);
                }
                else
                {
                    List<String> list = new ArrayList<String>();
                    list.add(tokens[2]);
                    treeMap.put(key, list);
                }
                count++;
            }
        }           
        scanner.close();
    }

    catch (IOException ioe)
    {
        ioe.printStackTrace();
    }
    System.out.println(count + " rows added");
}

これはWebアプリの一部です。Webアプリも正常に動作し、ファイル全体がメモリに読み込まれます。ユニットテストが依存するデータが最初の10,000行に含まれている場合、ユニットテストはANTで正常に合格します。私が考えることができる唯一のことは、それはメモリの問題であるに違いないということですが、なぜ私は例外がスローされないのですか?Eclipse内からANTターゲットを実行します。これは、Eclipse JUnitランナーと同じJVM引数、つまり-Xms512m-Xmx1234mで構成されています。ANTがデフォルトのJVMパラメータで起動すると、ヒープエラーで失敗するため、これらが正しく検出されることはわかっています。私がチェックできる他のアイデアはありますか?

4

1 に答える 1

1

このScannerタイプはI/Oエラーを飲み込みます。ioException()メソッドを使用して、エラーを明示的にチェックする必要があります。

問題がエンコードエラーである場合は、スキャナーをインスタンス化するときにファイルのエンコードを明示的に渡す必要があります。

ファイルが破損したテキストファイルである場合は、フォールトトレラントなデコードを行う独自のリーダーを用意する必要があります。正確性が低いため、可能であればこれを避ける必要があります。

于 2012-12-11T11:04:12.643 に答える