原先用PrintWrite写入的时候,设置编码为utf-8,但是不满足需求。追加使用BufferedWriter 字节流编码不支持utf-8-bom,新增写入之前的代码
FileOutputStream fos = null;
//需要UTF-8-BOM编码
byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
fos = new FileOutputStream(filePath, true);
fos.write(uft8bom);
public static void csvwriter(List<LinkedHashMap<String, String>> mapList, String[] headers, String filePath)
throws IOException {
check(mapList, headers, filePath);
//判断是否有源文件,如果有就追加写入
if (!readCsv(filePath)){
FileOutputStream fos = null;
//需要UTF-8-BOM编码
byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
fos = new FileOutputStream(filePath, true);
fos.write(uft8bom);
//第一次写入
try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(fos, "UTF-8"))) {
StringBuilder builder = new StringBuilder();
for(String header : headers) {
builder.append(header).append(",");
}
builder.deleteCharAt(builder.length() - 1);
printWriter.println(builder.toString());
builder.delete(0, builder.length());
for (LinkedHashMap<String, String> map : mapList) {
for (Map.Entry<String, String> entry : map.entrySet()) {
builder.append(entry.getValue()).append(",");
}
builder.deleteCharAt(builder.length() - 1);
printWriter.println(builder.toString());
builder.delete(0, builder.length());
}
}
}else {
//追加写入
// File csvFile = new File(filePath);
try{
FileOutputStream fos = null;
//需要UTF-8-BOM编码
byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
fos = new FileOutputStream(filePath, true);
fos.write(uft8bom);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"), 1024);
//遍历所有数据
for (LinkedHashMap<String, String> map : mapList) {
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
builder.append(entry.getValue()).append(",");
}
builder.append("\r\n");
bw.write(builder.toString());
}
bw.flush();
bw.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
感谢:https://www.cnblogs.com/jinzhiming/p/10317912.html