您的位置:

Java中PrintWriter中文乱码问题探究

一、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来输出字符,这样可以避免中文乱码问题。