Unicode编码中英文和中文都占两个字节。
那么
InputStream in = new FileInputStream("C:/test.txt");
// test.txt里写的是 abc
int b;
for((b = in.read())!= -1) {
System.out.println((char)b);
}既然中文英文都占两个字节,那么in.read()每次读出一个字节,即一次只读出来一个英文字母的一半,那么(char)后,岂不是也要变成乱码? 可结果并非乱码
是我哪里理解错了么?

解决方案 »

  1.   

    char是字符型,不是字节型喵~~``
      

  2.   

    int占4个字节,前三个字节为0。转变成char后,取后两个字节
      

  3.   

    首先楼主的这个写法是错误的,基本的语法错误!
    int b;
    for((b = in.read())!= -1) {
    System.out.println((char)b);
    } 其次,楼主使用的是Stream的read,所以不管文件怎么样,read都一次只读取1个字节,也就是8位,所以不存在楼主说的什么读取一半的情况。楼主可能把把InputStream和Reader混淆了,从Reader派生的子类也有read(),这个返回的是一个unicode字符单元,即0---65535的整数。一段简单的代码如下,楼主观察连个不同的输出,你就明白了! /**
     * t.txt的记录如下:
     * Chinses
     * 中文
     * 
     * */
        public static void main(String[] args) throws IOException{
         File f = new File("C:/t.txt");
         int b;
         InputStream in = new FileInputStream(f);
         while((b = in.read()) != -1){
         System.out.print((char)b); // 中文 必然会出现???
         }
        
         System.out.println();
        
         Reader r = new FileReader(f);
         while((b = r.read()) != -1){
         System.out.print((char)b); // 这里却相安无事!
         }
        }
      

  4.   

    主要是InputStream,OutputStream和Read,Write区别:前者读写都是以字节为单位,后者是以Unicode为单位。
      

  5.   

    这跟自己的的JDK环境的字符集有关系,中文的字符集是中国计算机研究院指定的GB2312基本中文操作系统上都有,楼主自己获取下JDK用的字符集编码看看,只要不是指定的是GB2312编码规则,在传输或是转换的时候都有几率出现乱码问题。这是我写的一篇关于实现转换类型的文章你可以参考下
      

  6.   

    abc属于ASCII字符。。前面都是0的。。而汉字前面都是1.
      

  7.   

    InputStream读取的是字节,char是字符