java中用fileinputstream中的read方法读取一个文件中的数据并打印出来,文件中的中文打印出来后会出现乱码现象。据说是因为inputstream是字节流,read方法每次只能读取一个字节的数据,而中文在java中是用两个字节表示的,相当于只读了一半,所以打印不出来。这样分析看似很有道理,但是我查了一下,java采用的是unicode编码,所以字符都是用两个字节表示的,这样的话问题就出来了:为什么同是两个字节表示,中文读一半打印不出来,而英文却可以呢 

解决方案 »

  1.   

    那是因为byte是8位的,char是16位的。inputstream的确是字节流,每次只能读一个byte,要想读出中文,要每次读两个byte,然后再合成一个char.如:byte[2]char a += byte[0]<<8;
    char a += byte[1];System.out.println(c);
      

  2.   

    你好,首先谢谢你的回答。
    我问的是JAVA中所有字符都是两个字节表示的,为什么中文乱码,英文不乱码。
      

  3.   

    java中是两个字节表示的,但是你要读的文件不是啊,那里面英文是一个字节,读一个字节就可以,读到流内是
    java底层实现的,对程序员来说是看不到的,具体怎么转换的不清楚!
    个人理解不知道对不对。
      

  4.   


    英文字付是一个字节,用ASCII码。
      

  5.   

    read 时是没有问题的,将所有信息以字节流形式读取,如果你在打印时没有设置成中文格式(如:utf-8) 可能虚拟机是以原有格式输出!  所以出现你说的乱码问题!
      

  6.   


    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"), "utf8")); 用这种方式读就可以指定编码,指定的编码与文件的编码一致,应该不会有乱码的
      

  7.   

    是编码与解码不一致的原因。
    6楼指定了其编码格式是UTF-8,当然解码时也得用UTF-8。
    System.out.println(br.nextLine().getBytes(),"UTF-8");
      

  8.   

    哦,,,应该是:
    System.out.println(new String(br.nextLine().getBytes(),"UTF-8"));
      

  9.   

    正解在这  http://blog.csdn.net/hyde82/archive/2005/06/15/394768.aspx