我有一套在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错误而失败。 还有其他想法我可以查看吗?
答案 0 :(得分:1)
Scanner
类型会吞下I / O错误。您必须使用ioException()方法明确检查错误。
如果问题是编码错误,则在实例化扫描程序时需要pass the encoding of the file explicitly。
如果文件是损坏的文本文件,您可能需要提供执行更多容错解码的your own reader。如果可能的话,应该避免这种情况,因为它不太正确。