假设我的整个 Eclipse 项目位于一个名为project
and 的目录中project
,其中有一个常规的非空、格式良好的文件data.txt
,和一个目录src
。在src
中,有两个目录:code
和 与目录test
名称完全相同的包。
在code
,我有以下文件A.java
package code;
import java.util.*;
import java.io.*;
public class A {
private static Map<Integer, String> m = makeMap("data.txt");
private static Map<Integer, String> makeMap(String file) {
Map<Integer, String> m = new HashMap<Integer, String>();
try {
int i = 0;
Scanner s = new Scanner(new File(file));
while (s.hasNextLine()) {
m.put(i, s.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
return m;
}
// a bunch of public static methods that use the global static variable m
}
在test
,我有ATest.java
,这是一个 JUnit 测试文件A.java
。它只包含几个测试用例,用于测试A.java
.
另外test
,我还有另一个文件TestSuite.java
,如下
package test;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import org.junit.runner.RunWith;
@RunWith(Suite.class)
@SuiteClasses({ ATest.class })
public final class TestSuite { }
如果我要ATest
在任何机器上运行,它将通过所有测试。如果我TestSuite
在 Windows 10 机器上运行,测试ATest
将失败,但如果我TestSuite
在 Fedora 23 Linux 机器上运行,则TestSuite
通过所有测试。
特别是在 Windows 上,程序能够成功地通过try
块而不抛出异常,但问题是s.hasNextLine()
返回false
,因此它从不读取文件的内容。这在 Fedora 上是相反的,在 Fedora 上,s.hasNextLine()
返回true
和继续执行能够在全局地图上执行操作。让我感到困惑的是,data.txt
两个平台上都是一样的,那么为什么一个平台的性能会与另一个平台不同呢?
有谁知道为什么会发生这种情况,以及我可以做些什么来使我的代码独立于平台?
编辑:
data.txt
包含日文字符,因此如果有帮助,它会以 UTF-8 编码