一、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來輸出字符,這樣可以避免中文亂碼問題。
原創文章,作者:OJBDI,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/330089.html