一、PrintWriter介绍
PrintWriter是Java IO库中提供的一个输出流,可以将数据写入到文件、控制台或者网络连接等目标中。PrintWriter同时提供了很多重载函数,可以打印各种不同类型的数据。
二、PrintWriter中文乱码问题原因
PrintWriter的write方法是单字符输出,而println等方法是字符串输出,在写入中文字符时,由于中文字符占用的字节数不同(一个或两个字节),而PrintWriter默认采用系统默认的编码方式(一般为UTF-8),如果写入的字符集和PrintWriter默认的字符集不一致,就会出现乱码现象。
比如以下代码:
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "GBK")); writer.println("中国"); writer.flush(); writer.close();
可以看出,输出流的字符集被设置为GBK,而字符串“中国”默认是UTF-8编码,写入时就会出现乱码。
三、PrintWriter中文乱码解决方法
1、通过设置OutputStreamWriter字符集
可以通过向PrintWriter的构造函数传递一个OutputStreamWriter对象,来设置输出流的字符集。
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "GBK"));
这样就可以将输出流的字符集设置为GBK,就能够正常输出“中国”字符串了。
2、通过设置PrintWriter的编码方式
除了通过设置OutputStreamWriter字符集来解决中文乱码问题,还可以使用PrintWriter的构造函数,直接设置字符集。
PrintWriter writer = new PrintWriter(outputStream, true, "GBK");
第三个参数“GBK”就是设置输出流字符集的操作,这样在后续输出中,PrintWriter就可以正确打印中文字符了。
3、使用PrintStream代替PrintWriter
PrintStream是Java IO库中提供的另外一个输出流,可以将数据写入到文件、控制台或者网络连接等目标中。
和PrintWriter不同的是,PrintStream在输出时会将字符串转换为字节数组,而且默认情况下使用的是ISO-8859-1编码,不会出现中文乱码问题。
PrintStream printStream = new PrintStream(outputStream); printStream.println("中国"); printStream.flush(); printStream.close();
这样就可以输出中文字符了。
四、总结
在使用PrintWriter输出中文字符时,需要注意设置输出流的字符集或者PrintWriter的编码方式,否则就会出现中文乱码问题。另外,如果不需要使用PrintWriter的高级功能,可以使用PrintStream来输出字符,这样可以避免中文乱码问题。