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个字节的内容吗?
————————————————————
网上摘来的 老实说我不是很明白其中的具体编码细节,只知道能这样用,知道的讲下,谢谢!!!

解决方案 »

  1.   

    字符流并非以2个字节为单位,而是根据不同的编译,不同的字符有不同的字节数对于我们常用的GBK中,英文是占用1个字节,中文是2个
    对于UTF-8,英文是1个,中文是3个
    对于Unicode,英文中文都是2个
      

  2.   

    如果我在国外用的操作系统是utf-8的字符集。如果会到国内用的操作系统是GBK的字符集,那产生文件的读写和显示是不是就要出问题了,要注意编码转换问题。
      

  3.   

    那如果以Write的形式输出到文件中,那在实际开发中是要不要在开发文档中写明当前所使用的字符集
      

  4.   

    应该是需要的吧,不过最好是能够处理两种编码,就是自己程序去判断,如果你在开发文档中写上,对用户岂不是有点束缚。对于中文乱码可以getBytes();转化一下
      

  5.   

    因为有这样的代码:InputStreamReader ir = new InputStreamReader((new FileInputStream("c:/cmd.txt")));
    System.out.print(ir.getEncoding());猛一看还以为InputStreamReader 可以动态识别字符编码,
    试了一下,发现ir.getEncoding()永远是GBK,和cmd.txt文件本身的编码没关系如果cmd.txt保存成UTF-8,这段程序就是乱码
    ........
      

  6.   

    不知道有什么办法可以自动识别文本文件的编码,比如,Windows的记事本就可以做到,应该也是可以自动识别的
      

  7.   

    记事本也只是根据前面几个字符去判断一下可能是什么字符罢了它好像是判断第1、2个字节是否Unicode字符,如果不是就认为是GBK了如果你在a.txt中输入“联通”关闭再打开就会是乱码了(“移动”不会,这也是联通为什么不如移动的地方,^_^)
      

  8.   

    .txt文件是文本字符流文件国内的Windows用的都是GBK编码。JAVA具有跨平台特性,所以在国内的Windows上操作它利用本地ir.getEncoding()默认字符集也就是GBK编码,所以两者可以很好沟通,如果把这个.txt文件放在默认字符集不是GBK的操作系统上运行,我看也得出问题。不知道我这样想对不对!~~
      

  9.   

    如果你在a.txt中输入“联通”关闭再打开就会是乱码了(“移动”不会,这也是联通为什么不如移动的地方,^_^)
    ————————————————————
    靠 有这种事,我试下看看。
      

  10.   

    果然,移动正常,联通乱码。。哈
    这也说明记事本不止根据文件头的字符判断。用记事本保存的UTF-8文件文件头是:EF BB BF手工把文件头的这3个字节删除,记事本还能识别成UTF-8,而不会误认为是GBK
      

  11.   

    跟操作系统使用的编码系统有关,java会在编译时自动寻找操作系统用的字符码,简体中文的是GBK