Java 涉及文件读取的JUnit测试套件在Windows 10和Fedora 23上的性能有所不同
假设我的整个Eclipse项目位于名为Java 涉及文件读取的JUnit测试套件在Windows 10和Fedora 23上的性能有所不同,java,eclipse,junit,windows-10,fedora-23,Java,Eclipse,Junit,Windows 10,Fedora 23,假设我的整个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
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
}
如果我在任何机器上运行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
这是使用构造函数完成的。您需要指定正在读取的文件的编码。如果未指定,则将使用平台默认值,该默认值并不总是UTF-8
这是使用构造函数完成的。文本文件的编码是什么?这只是一种怀疑。另一个是文件的路径。您可以同时选中这两个字符。它包含日文字符,所以是UTF-8。这会引起问题吗?另外,你能解释一下你所说的文件路径是什么意思吗?它包含在project中,所以如果您正在寻找它,它应该是project/data.txt,但我不认为这就是您要问的。正如我所说,如果您认为路径不是问题,那么您应该检查两件事,它留给您编码,@ArchimedesTrajano的答案已经为您提供了一个可能的解决方案。在windows系统中打开的文件在大多数情况下并不总是UTF-8,因此您应该在代码中解决这个问题。文本文件的编码是什么?这只是一种怀疑。另一个是文件的路径。您可以同时选中这两个字符。它包含日文字符,所以是UTF-8。这会引起问题吗?另外,你能解释一下你所说的文件路径是什么意思吗?它包含在project中,所以如果您正在寻找它,它应该是project/data.txt,但我不认为这就是您要问的。正如我所说,如果您认为路径不是问题,那么您应该检查两件事,它留给您编码,@ArchimedesTrajano的答案已经为您提供了一个可能的解决方案。在windows系统中打开的文件大多数情况下并不总是UTF-8,因此您应该在代码中解决这个问题。
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 { }