[Java]通过控制台使用 jar 文件输出不正确

[Java]Incorrect output using jar file via console

来自输入 txt 文件的俄罗斯名字列表

此代码在调试期间在 IntelliJ Idea 中正确地对这些名称进行排序。 当我从 windows 控制台 java -jar E:\sort-it.jar 创建一个 jar 文件并 运行 它时,在输出文件中,名字是 Roman,尽管在调试时它应该是 Aleksandr。

jar 启动的错误顺序是

正确的顺序是

可能是什么问题?

package programs;

import java.io.*;
import java.util.*;

public class Main{

  public static String inputFileName = "E:/in.txt";
  public static String outputFileName = "E:/out.txt";

  public static List<String> FetchFileData(String fileName) throws IOException {
    List<String> tempArray = new ArrayList();
    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    String line;
    while ((line = reader.readLine()) != null){
        tempArray.add(line);
    }
    reader.close();
    return tempArray;
  }

  public static List<String> SortWords(List<String> inputArray) {
    String temp;
    for (int i = 0; i < inputArray.size(); i++){
        for (int j = i + 1; j < inputArray.size(); j++){
            if (inputArray.get(i).compareTo(inputArray.get(j)) > 0){
                temp = inputArray.get(i);
                inputArray.set(i, inputArray.get(j));
                inputArray.set(j, temp);
            }
        }
    }
    return inputArray;
  }

  public static void WriteToFile(List<String> inputArray, String fileName) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    for (int i = 0; i < inputArray.size(); i++) {
        writer.write(inputArray.get(i));
        writer.newLine();
    }
    writer.close();
  }

  public static void main(String[] args) throws IOException {
    List<String> unsortedArray;
    List<String> sortedArray;                
    unsortedArray = FetchFileData(inputFileName);
    sortedArray = SortWords(unsortedArray);
    WriteToFile(sortedArray, outputFileName);
  }
}

一个小问题是FileReader使用了默认的平台编码。 在 IDE & Windows 中,可能是控制台中的另一个。 最好这样做:

public static List<String> FetchFileData(String fileName) throws IOException {
    Charset charset = Charset.forName("Cp1251");
    return Files.readAllLines(Paths.get(fileName), charset);
}

指定文件的字符集可确保应用程序可移植到其他计算机(具有相同文件)。 Files 也支持写入。

确保每一行都去掉空格和 Unicode BOM 字符,\uFEFF:

String line = lines.get(i);
line = line.trim().replace("\uFEFF", "");

有更好的解决方案 compareTo 已经说过了。

除了西里尔字母之外,没有插入类似拉丁文的狡猾字母。

代码看起来也不错。

所以检查字符集;还有一些我看不到的东西,尽管它不太可能。