我们读取文本(无论从那儿读,键盘,硬盘)的时候:
尽量使用:
(从硬盘读)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----锟斤拷锟?