我有一套在 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 应用程序也工作正常,整个文件都加载到内存中。 如果我的单元测试所依赖的数据包含在前 10,000 行中,那么单元测试可以通过 ANT。 我唯一能想到的是它一定是内存问题,但为什么我没有抛出异常。 我从 Eclipse 中运行我的 ANT 目标。它配置了与我的 Eclipse JUnit 运行程序相同的 JVM 参数,即 -Xms512m -Xmx1234m。我知道它正确地选择了这些,因为如果 ANT 使用默认的 JVM 参数启动,那么它将因堆错误而失败。 还有什么我可以检查的其他想法吗?
最佳答案
Scanner
类型吞噬了 I/O 错误。您必须使用 ioException() 显式检查错误方法。
如果问题是编码错误,您需要 pass the encoding of the file explicitly当您实例化扫描仪时。
如果文件是损坏的文本文件,您可能需要提供 your own reader做更多的容错解码。应尽可能避免这种情况,因为它不太正确。
关于java - 为什么在通过 ANT 运行时我的文件无法正确读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13818098/