字节流和字符流
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