在创建文件并打印字符串时,如果不指定编码,默认是按系统的编码格式来。比如我们的linux环境中编码如下:
CMREAD-SV43 /home/wlf> locale LANG=en_US.UTF-8 LC_CTYPE="zh_CN.GBK" LC_NUMERIC="zh_CN.GBK" LC_TIME="zh_CN.GBK" LC_COLLATE="zh_CN.GBK" LC_MONETARY="zh_CN.GBK" LC_MESSAGES="zh_CN.GBK" LC_PAPER="zh_CN.GBK" LC_NAME="zh_CN.GBK" LC_ADDRESS="zh_CN.GBK" LC_TELEPHONE="zh_CN.GBK" LC_MEASUREMENT="zh_CN.GBK" LC_IDENTIFICATION="zh_CN.GBK" LC_ALL=zh_CN.GBK
中文编码看LC_ALL,这里我们环境配置的是GBK,那么如下代码就是使用GBK来的,因为这里并未设置默认编码格式:
protected void writerLog(String content) { // 记录创建时间为当前时间 createDate = new Date(); try { // 生成文件对象,如果文件不存在,要创建新文件。 File file = new File(this.fileName); if (!file.exists() && file.createNewFile()) { // 上面方法有返回值,findBugs会报警,所以采用空实现的形式解决 ; } // 获得当前文件大小 this.fileSize = file.length(); file = null; // 打开输出 this.logWriter = new PrintWriter(new FileWriter(this.fileName, true), true); } catch (IOException e) { e.printStackTrace(); this.logWriter = null; } this.logWriter.print(content); this.logWriter.flush(); }
如何指定具体的编码格式呢?我们把这一行改下:
this.logWriter = new PrintWriter(new FileWriter(this.fileName, true), true);
使用OutputStreamWriter对象来指定UTF-8编码:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(this.fileName, true), "UTF-8"); this.logWriter = new PrintWriter(osw, true);