为什么在通过ANT运行时我的文件无法正确读取

时间:2012-12-11 10:18:16

标签: java ant

我有一套在Eclipse中运行的单元测试,一切正常。它们依赖于从非常大的数据加载的数据。 20MB文件。 但是,当我从ANT运行单元测试时,测试失败,因为某些数据未加载。发生的事情是我的文件读取机制没有读取整个文件,它只是停止,在读取大约10,000个900,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 args,即-Xms512m -Xmx1234m。我知道它正确地选择了这些,因为如果ANT使用默认的JVM参数启动,那么它将因Heap错误而失败。 还有其他想法我可以查看吗?

1 个答案:

答案 0 :(得分:1)

Scanner类型会吞下I / O错误。您必须使用ioException()方法明确检查错误。

如果问题是编码错误,则在实例化扫描程序时需要pass the encoding of the file explicitly

如果文件是损坏的文本文件,您可能需要提供执行更多容错解码的your own reader。如果可能的话,应该避免这种情况,因为它不太正确。