我有一个UTF-8文件(它是一个csv) 我需要逐行读取这个文件做一些替换,然后逐行写入另一个文件。
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(fileFix), "ASCII")
);
bw.write(""); //clean current file
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file),"UTF-8")
);
String line;
while ((line = br.readLine()) != null) {
line = line.replace(";", ",");
bw.append(line + "\n");
}
这很简单。
问题是输出文件(fileFix)是UTF-8,我认为它有BOM字符。
如何在没有BOM的情况下将文件写为普通ANSI?
使用软件(weka)读取文件时出现的错误
此档案的第一行:
考虑到notepad ++告诉我charset是UTF-8。如果我尝试使用纯ASCII(使用Windows记事本)转换此文件,则该字符会消失
当您在第一线运行时:
line = line.substring(1);
删除任何BOM char。
答案 0 :(得分:3)
听起来这是一个BOM问题,而不是编码问题。
您可以在编写文件时删除任何BOM字符,并使用:
line = line.replace("\ufeff", "");
这就留下了一个问题,即您是否正在准确地阅读数据......我强烈建议您不要使用FileWriter
和FileReader
完全 - 而是使用InputStreamReader
和OutputStreamWriter
,明确指定两者的编码。将读取器编码设置为UTF-8(假设输入文件确实是UTF-8),并将编写器编码设置为您想要的任何...但我建议坚持使用UTF-8,说实话。
另请注意,您应该在finally
块中关闭读取器/写入器,或者如果您使用的是Java 7,则应使用try-with-resources语句。
答案 1 :(得分:1)
查看http://en.wikipedia.org/wiki/Byte_order_mark要替换的模式,看起来像EF BB BF而不是FE FF
此解决方案错误检查Jons回答intsead