私の Eclipse プロジェクト全体が と という名前のディレクトリにあるproject
としproject
ます。その中には、通常の空ではなく適切にフォーマットされたファイルdata.txt
と、単一のディレクトリ がありsrc
ます。には、ディレクトリとまったく同じ名前のパッケージ用のとのsrc
2 つのディレクトリがあります。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
。の public static 関数をテストするいくつかのテスト ケースが含まれているだけ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
は、両方のプラットフォームで同じであるということです。
なぜこれが起こっているのか、コードをプラットフォームに依存しないようにするために何ができるのか、誰か知っていますか?
EDITS:
data.txt
日本語の文字が含まれているため、役立つ場合はUTF-8でエンコードされています