在编码的过程中,需要写入CSV格式的文件,在已经写入的文件里面继续追加内容,
但是写入的文件总是编码不一致导致处理乱码问题,经过一番寻找,终于找到答案,希望对大家有帮助
demo代码如下:
String[] header = {"标题","内容","显示"};
String[] header1 = {"商汇","打怪兽","商汇"};
try{
CsvWriter cw = new CsvWriter("E:/b.csv",',',Charset.forName("GBK"));
cw.writeRecord(header);
cw.writeRecord(header1);
cw.close();
//追加文件内容
String[] header2 = {"商汇1","打怪兽1","商汇1"};
String[] header3 = {"商汇2","打怪兽2","商汇2"};
BufferedWriter out = new BufferedWriter(new
OutputStreamWriter(new FileOutputStream("E:/b.csv",true),"GBK"),1024);
cw = new CsvWriter(out,',');
cw.writeRecord(header2);
cw.writeRecord(header3);
cw.close();
package cn.howso.deeplan.son.feeder.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Date; import com.csvreader.CsvReader; import com.csvreader.CsvWriter; public class ReadandwriteCsv { public static void main(String[] args) throws IOException { Date datestart =new Date(); System.out.println(datestart+"******"); String [] str = {"city_id","city_name","city_pid","level"}; int [] needs = {1,2,3,4,5,6}; String inString = ""; String tmpString = ""; File inFile = new File("E://srr//plan_ott_data_nanjing.csv"); // 读取的CSV文件 File outFile = new File("E://srr//plan_ott_data_nanjing_srr.csv");//输出的CSV文 try { BufferedReader reader = new BufferedReader(new FileReader(inFile)); CsvReader creader = new CsvReader(reader, ','); CsvWriter cwriter =new CsvWriter(new BufferedWriter(new FileWriter(outFile)),','); System.out.println("开始读取"+"******"); String datatime =""; while(creader.readRecord()){ inString = creader.getRawRecord();//读取一行数据 if(!datatime.equals(inString.split(",")[0].substring(0, 8))){ datatime=inString.split(",")[0].substring(0, 8); outFile= new File("E://srr//plan_ott_data_nanjing_"+datatime+".csv"); cwriter.flush();// 刷新数据 cwriter.close(); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E://srr//plan_ott_data_nanjing_"+datatime+".csv",true),"GBK"),1024); cwriter = new CsvWriter(out,','); System.out.println("创建一个新文件,行数"+creader.getCurrentRecord()); } // System.out.println(creader.getCurrentRecord()+"::::::"+rowNum); for(int i = 0;i < str.length;i++){ inString = inString.replace(str[i], "," + str[i] + ","); tmpString=inString; // for(int j = 0;j < needs.length;j++){ // tmpString+=inString.split(",")[needs[j]]; // } } //第一个参数表示要写入的字符串数组,每一个元素占一个单元格,第二个参数为true时表示写完数据后自动换行 cwriter.writeRecord(tmpString.split(","), true); //注意,此时再用cwriter.write(inString)方法写入数据将会看到只往第一个单元格写入了数据,“,”没起到调到下一个单元格的作用 //如果用cwriter.write(String str)方法来写数据,则要用cwriter.endRecord()方法来实现换行 //cwriter.endRecord();//换行 cwriter.flush();//刷新数据 } creader.close(); cwriter.close(); Date datesend =new Date(); System.out.println(datesend+"******"); System.out.println("耗时:"+(datesend.getTime()-datestart.getTime())/60000); } catch (FileNotFoundException ex) { ex.printStackTrace(); } } }
}catch (Exception ex){
ex.printStackTrace();
}