假设我的整个 Eclipse 项目位于一个名为 project
的目录中,并且在 project
中,有一个常规的非空、格式良好的文件 data.txt。 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
中公共(public)静态函数的测试用例。
另外在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 上运行 TestSuite
Linux 机器,TestSuite
通过了所有测试。
特别是,在 Windows 上,程序能够成功地完成 try
block ,而不会引发异常,但问题是 s.hasNextLine()
返回 false
因此它永远不会读取文件的内容。这与 Fedora 相反,其中 s.hasNextLine()
返回 true
并继续能够在全局 map 上执行操作。让我困惑的是,data.txt
在两个平台上都是相同的,那么为什么一个平台的表现会与另一个平台不同呢?
有谁知道为什么会发生这种情况,以及我可以做些什么来使我的代码独立于平台?
编辑:
data.txt
包含日语字符,因此如果有帮助的话,它会以 UTF-8 进行编码
最佳答案
您需要指定正在读取的文件的编码。如果未指定,它将使用平台默认值,并不总是 UTF-8
这是使用 Scanner(File, String charset)
完成的构造函数。
关于java - 涉及文件读取的 JUnit 测试套件在 Windows 10 和 Fedora 23 上的表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35387533/