我遇到了一个关于netbeans的奇怪问题;我的程序需要读取一个csv文件并从中获取前两列。我正在使用opencsv进行解析。在我构建我的程序并尝试在netbeans之外运行jar之后,该程序没有按预期运行。经过多次调试,试图弄清楚出了什么问题,我已经设法缩小了问题的范围。
我的程序应该从文本文件中读取汉字。在netbeans内部,它做得非常好。但是如果我尝试在netbeans之外运行它,就会发生两件事。
1)它没有读成正确的字符。如果我把我读到的所有内容都输出到一个新的csv文件中,那么我得到的字符就像:会和髪而不是汉字。我的csv文件的第二列是英文的,可以正确读入和写出。
2)它没有阅读所有的行;当我计算读取了多少行时,IDE内部的数字是正确的。但除此之外,我错过了大约100行。
任何人都可以帮我弄清楚为什么会这样吗?除了英语之外,我从来没有使用任何东西,所以字符编码对我来说有点陌生。但我确实检查了netbeans,编码设置为utf-8。
编辑:评论中要求的代码。虽然我不知道这是否会有所帮助。变量映射是一个散列映射。
private void loadNames() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
reader = new CSVReader(new FileReader(file));
String[] line;
while ((line = reader.readNext()) != null) {
map.put(line[0], line[1]);
}
//debug code
int counter = 0;
CSVWriter writer = new CSVWriter(new FileWriter("test.txt"), ',',
CSVWriter.NO_QUOTE_CHARACTER,
CSVWriter.NO_ESCAPE_CHARACTER,
System.getProperty("line.separator"));
for(Map.Entry<String, String> entry : map.entrySet()){
String[] string = {entry.getKey(), entry.getValue()};
writer.writeNext(string);
counter++;
}
JOptionPane.showMessageDialog(null, counter);
} catch (FileNotFoundException ex) {
ErrorHandler.displayError("ka_data.csv file not found in folder Data");
} catch (IOException ex) {
ErrorHandler.displayError("error at readNext");
}
}
});
thread.start();
}
答案 0 :(得分:2)
您是否尝试在读取文件时手动设置字符集?我怀疑你有一个默认的字符集问题。试试:
new CSVReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));