0

假设我的整个 Eclipse 项目位于一个名为projectand 的目录中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,这是一个 JUnit 测试文件A.java。它只包含几个测试用例,用于测试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两个平台上都是一样的,那么为什么一个平台的性能会与另一个平台不同呢?

有谁知道为什么会发生这种情况,以及我可以做些什么来使我的代码独立于平台?

编辑: data.txt包含日文字符,因此如果有帮助,它会以 UTF-8 编码

4

1 回答 1

3

您需要指定正在读取的文件的编码。如果未指定,它将使用平台默认值,并不总是 UTF-8

这是使用Scanner(File, String charset)构造函数完成的。

于 2016-02-14T02:51:30.540 回答