假设我的整个Eclipse项目都在一个名为project
的目录中,并且在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
,这是一个用于A.java
的JUnit测试文件。它只包含几个测试用例,用于测试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
,它将通过所有测试。如果我在Windows 10机器上运行TestSuite
,ATest
中的测试将失败,但是如果我在Fedora 23 Linux机器上运行TestSuite
,TestSuite
通过所有测试。
特别是在Windows上,该程序能够成功地通过try
块而不会引发异常,但问题是s.hasNextLine()
返回false
因此它永远不会读取文件的内容。这与Fedora相反,在Fedora中,s.hasNextLine()
返回true
并继续能够在全球地图上执行操作。让我感到困惑的是,两个平台上的data.txt
相同,那么为什么一个平台的性能与另一个平台不同呢?
有谁知道为什么会发生这种情况,以及我可以做些什么来使我的代码独立于平台?
编辑: data.txt
包含日语字符,因此如果有帮助,则以 UTF-8 编码
您需要指定正在读取的文件的编码。 如果未指定,它将使用平台默认值,该默认值并不总是 UTF-8
这是使用 Scanner(File, String charset)
构造函数完成的。