我們讀取文本(無論從那兒讀,鍵盤,硬盤)的時候:
儘量使用:
(從硬盤讀)InputStreamReader ir=new InputStreamReader(fileInputStream,"編碼");
(從鍵盤讀)InputStreamReader ir=new InputStreamReader(System.in,"編碼");
可以指定編碼。
輸出文本時,
(輸出到硬盤)PrintStream ps=new PrintStream(fileInputstream,"編碼");
(輸出到顯示器)Sytem.out.(不用再指定編碼,系統用的是默認,輸出也用默認。)
我們讀文件(從硬盤)是這樣:從 二進制----字符。
我們輸出文件(向硬盤)是這樣:從 字符----二進制。
打印在屏幕上: 字符----(指定編碼)--二進制--(這個過程是控制檯的解碼)--字符(我們看到的)
內存從鍵盤讀入是這樣:
字符--(這個過程是系統的編碼)--二進制--(我們指定解碼)--字符(內存讀到的)
特殊之處,看下邊這個例子:
class ReadIn
{
public static void main(String[] args) throws IOException
{
BufferedReader bufr=new BufferedReader(
new InputStreamReader(System.in,"utf-8"));
BufferedWriter bufw=new BufferedWriter(
new OutputStreamWriter(System.out,"utf-8"));//
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}
程序運行結果 :
你好
???
錕斤拷錕?
解釋:你好 是我們輸入的。
在讀取的過程中,我們指定爲uft-8來解碼,
你好的gbk碼[-60,-29,-70,-61] --按照utf-8 來解碼,---(沒找到符合utf-8規則的數據),就解成了???
解錯了的字符(就是上邊的???) --按照utf-8 來編碼---[-17,-65,-67,-17,-65,-67,-17,-65,-67]
[-17,-65,-67,-17,-65,-67,-17,-65,-67]--在終端,按照gbk----錕斤拷錕?