[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
已经说过了。
除了西里尔字母之外,没有插入类似拉丁文的狡猾字母。
代码看起来也不错。
所以检查字符集;还有一些我看不到的东西,尽管它不太可能。
来自输入 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
已经说过了。
除了西里尔字母之外,没有插入类似拉丁文的狡猾字母。
代码看起来也不错。
所以检查字符集;还有一些我看不到的东西,尽管它不太可能。