我使用FileInputStream类,调用read()从一个文件里读出里面的内容,里面有中文的
第一个程序是我把它直接显示在命令行窗口上,System.out.print(b);结果中文显示的是一堆问号;
第二个程序是我把它写入另一个文件里面,write(b);结果中文可以显示出来了怎么不同的呢...
不是说FileInputStream的read()是读出一个字节的么,而中文是两个字节的,应该显示的是像在命令行窗口那样一堆问号的,为什么写入文件里显示正常呢??请大侠指教指教

解决方案 »

  1.   

    FileInputStream,是字节流,一个汉字占两个字节,read()只能读出半个汉字。
    用FileReader试试?一块学习。
      

  2.   

    这个问题可以这么理解
    首先假设文件里的内容是二进制对应的二进制编码为B6 FE  BD F8  D6 C6调用read()按字节读取的时候是先读入B6 再读入FE 接着是BD 
    用System.out.print(b);打印出单个字节的时候也是先打印出B6对应unicode的字符 再打印出FE对应unicode的字符也就是每次打印一个字节就显示对应unicode的字符 但是中文操作系统没有这些异常字符 所以显示问号
    而当写入文件的时候 虽然是先写入B6 再写入FE 接着是BD。。一个字节一个字节写入的 但是字节的顺序没有变
    全部写入完成之后 文件的二进制表示形式还是B6 FE  BD F8  D6 C6 当用记事本打开的时候就一次对内容进行Unicode编码 显示出二进制三个字 这和之前的每个字节编码一次是完全不一样的 
      

  3.   

    补充一下,inputstream是一次都读一个字节,但并没有对内容造成破坏,也就是说没有把字节的顺序打乱,所有你不管你用什么流读出来再放进去,文本里的字节是没有变化的,而文本为什么能正确显示,是因为记事本本身这个程序知道他的编码方式,所有这个时候和你程序没有任何关系了!
      

  4.   

    用read()时是读到一个字节就显示,汉字是双字节的,被拆开就不是汉字了;输出到文件后,再用记事本打开时,记事本是会判断当前字节是否是双字节字符的首字节的,所以就不会乱码啦。6楼说得对,用记事本看时确实和你的程序没有关系啦,当然,你也可以自己去判断读到的字节是否是一个双字节字符的首字节,来让你的程序不显示乱码......
      

  5.   

    inputstream字节流
    write字符流
    如果你输出时还是用字节流outputstream,你会看到还是一堆问号?
    如果你输入时用的是字符流,或者用inputstreamReader转换,那你可以直接用标准输出可以看到还是汉字
    IO最基本的知识,我刚刚学过了,窃喜。。