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

时间:2017-08-25 14:15:54

标签: java sorting intellij-idea jar insertion-sort

来自输入txt文件的俄语名称列表

  • Александр
  • Роман
  • Михаил

此代码在调试期间在IntelliJ Idea中正确排序这些名称。 当我创建一个jar文件并从Windows控制台java -jar E:\\sort-it.jar运行它时,然后在输出文件中,第一个名称是Роман,尽管它应该是Александр,就像调试一样。

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);
  }
}

1 个答案:

答案 0 :(得分:1)

一个小问题是FileReader使用默认的平台编码。 在IDE&amp; Windows可能是控制台中的另一个。 更好:

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

指定文件的charset可确保应用程序可移植到其他计算机(具有相同的文件)。 Files也为写作提供支持。

确保每一行都修剪了空格,并且可能是Unicode BOM字符\uFEFF

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

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

没有插入令人毛骨悚然的拉丁语相似的字母,而不是西里尔字母。

代码也很好。

所以检查一下charset;我没看到的其他东西,尽管不太可能。