日期:2014-05-20  浏览次数:20660 次

字节流和字符流
FileInputStream   fi   =   new   FileInputStream( "c:/cmd.txt ");
while((temp=fi.read())!=-1)
System.out.print((char)temp);

InputStreamReader   ir   =   new   InputStreamReader((new   FileInputStream( "c:/cmd.txt ")));
int   temp;
System.out.print(ir.getEncoding());
while((temp=ir.read())!=-1)
System.out.print((char)temp);

cmd.txt里面是英文文本

既然有字节流和字符流的区别
字节流是以一个字节为单位,而字符流是2个字节为单位的
为什么这两段程序的read输出都一样?
下面的不是要每次读出2个字节的内容吗?
————————————————————
网上摘来的   老实说我不是很明白其中的具体编码细节,只知道能这样用,知道的讲下,谢谢!!!

------解决方案--------------------
你加点中文就看出来了
------解决方案--------------------
字符流并非以2个字节为单位,而是根据不同的编译,不同的字符有不同的字节数

对于我们常用的GBK中,英文是占用1个字节,中文是2个
对于UTF-8,英文是1个,中文是3个
对于Unicode,英文中文都是2个
------解决方案--------------------
应该是需要的吧,不过最好是能够处理两种编码,就是自己程序去判断,如果你在开发文档中写上,对用户岂不是有点束缚。对于中文乱码可以getBytes();转化一下

------解决方案--------------------
因为有这样的代码:

InputStreamReader ir = new InputStreamReader((new FileInputStream( "c:/cmd.txt ")));
System.out.print(ir.getEncoding());

猛一看还以为InputStreamReader 可以动态识别字符编码,
试了一下,发现ir.getEncoding()永远是GBK,和cmd.txt文件本身的编码没关系

如果cmd.txt保存成UTF-8,这段程序就是乱码
........
------解决方案--------------------
不知道有什么办法可以自动识别文本文件的编码,

比如,Windows的记事本就可以做到,应该也是可以自动识别的
------解决方案--------------------
果然,移动正常,联通乱码。。哈


这也说明记事本不止根据文件头的字符判断。

用记事本保存的UTF-8文件文件头是:EF BB BF

手工把文件头的这3个字节删除,记事本还能识别成UTF-8,而不会误认为是GBK
------解决方案--------------------
跟操作系统使用的编码系统有关,java会在编译时自动寻找操作系统用的字符码,简体中文的是GBK