黑马程序员技术交流社区

标题: 请帮忙解释这一现象(字节流和字符流) [打印本页]

作者: 杨增坤    时间: 2013-7-20 17:20
标题: 请帮忙解释这一现象(字节流和字符流)
本帖最后由 杨兴庭 于 2013-7-21 12:31 编辑

public class Text {
        public static void main(String[] args) throws IOException {        
                InputStreamIn();
                InputStreamToReader();
               
        }
        /**
         * 利用InputStream循环输入并输出
         */
        public static void InputStreamIn() {
                InputStream input = System.in;
                int r = 0;
                StringBuffer buf = new StringBuffer();
                System.out.println("请录入数据");
                try {
                        while ((r = input.read()) != -1) {
                                if (r == '\r')
                                        continue;
                                if (r == '\n') {
                                        System.out.println(buf.toString());
                                        buf.delete(0, buf.length());
                                } else {
                                        buf.append((char) r);
                                }
                                if (buf.toString().equalsIgnoreCase("over"))
                                        break;


                        }
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                System.out.println("结束");
        }


        /**
         * 字节流转换成字符流后然后用字符流缓冲区读取
         */
        public static void InputStreamToReader() {
                System.out.println("请输入");
                InputStream in = System.in;// 定义了键盘输入流字节流
                InputStreamReader reder = new InputStreamReader(in);// 字节流转换成字符流
                BufferedReader bufRea = new BufferedReader(reder);// 利用缓冲区提高效率
                String line = null;
                try {
                        while ((line = bufRea.readLine()) != null) {
                                if (line.equalsIgnoreCase("over")) {
                                        break;
                                }
                                System.out.println(line);
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        try {
                                in.close();
                                reder.close();
                                bufRea.close();
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }


                }
                System.out.println("结束");
        }
}
结果:
疑问:为什么用InputStream字节流输入后,然后读取汉字的话输出的不是汉字呢,
若把字节流转换成字符流,然后读取,读取汉字后,输出的是正确的汉字,还请各位帮忙解释一下。

1.png (6.81 KB, 下载次数: 0)

1.png

作者: 草貌路飞    时间: 2013-7-20 18:27
默认是gbk编码 字母和数字是一个字节,汉字两个。第一种方式一次读一个字节(虽然它读在int类型里面,但还是只读了一个字节),读字母没问题,读汉字就错了。
作者: 占琳    时间: 2013-7-20 18:37
字节流读的是二进制数据,字符流读取的是字符,两者不可能相同,再者字符流读取字符时候,底层还是字节流,只不过需要包装了一层转换的字符流,通俗来说就是不管字符流字节流都是用二进制读取,然后字符流把读取的二进制数据进行转换格式,才能读出正确的汉字。
作者: 杜光    时间: 2013-7-21 09:02
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。
作者: 杨增坤    时间: 2013-7-21 10:12
杜光 发表于 2013-7-21 09:02
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。

怎么更改为已解决!!
作者: 杨增坤    时间: 2013-7-21 13:58
谢谢,大家回复,已经懂了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2