0

私の Eclipse プロジェクト全体が と という名前のディレクトリにあるprojectとしprojectます。その中には、通常の空ではなく適切にフォーマットされたファイルdata.txtと、単一のディレクトリ がありsrcます。には、ディレクトリとまったく同じ名前のパッケージ用のとのsrc2 つのディレクトリがあります。codetest

には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
}

testATest.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と、すべてのテストに合格します。TestSuiteWindows 10 マシンで実行すると、テストATestは失敗しますがTestSuite、Fedora 23 Linux マシンで実行すると、TestSuiteすべてのテストに合格します。

特に、Windows では、プログラムはtry例外をスローせずにブロックを最後まで正常に処理できますが、問題はそれs.hasNextLine()が返さfalseれるため、ファイルの内容を読み取らないことです。これは Fedora とは対照的です。Fedora では、グローバル マップ上でアクションを実行できるようにs.hasNextLine()戻ります。true私を混乱させているのdata.txtは、両方のプラットフォームで同じであるということです。

なぜこれが起こっているのか、コードをプラットフォームに依存しないようにするために何ができるのか、誰か知っていますか?

EDITS: data.txt日本語の文字が含まれているため、役立つ場合はUTF-8でエンコードされています

4

1 に答える 1

3

読み取るファイルのエンコーディングを指定する必要があります。指定されていない場合は、常に UTF-8 であるとは限らないプラットフォームのデフォルトが使用されます。

これは、Scanner(File, String charset)コンストラクターを使用して行われます。

于 2016-02-14T02:51:30.540 に答える