A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨增坤 金牌黑马   /  2013-7-20 17:20  /  1208 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 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

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

6 个回复

倒序浏览
默认是gbk编码 字母和数字是一个字节,汉字两个。第一种方式一次读一个字节(虽然它读在int类型里面,但还是只读了一个字节),读字母没问题,读汉字就错了。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
字节流读的是二进制数据,字符流读取的是字符,两者不可能相同,再者字符流读取字符时候,底层还是字节流,只不过需要包装了一层转换的字符流,通俗来说就是不管字符流字节流都是用二进制读取,然后字符流把读取的二进制数据进行转换格式,才能读出正确的汉字。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。
回复 使用道具 举报
杜光 发表于 2013-7-21 09:02
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。

怎么更改为已解决!!
回复 使用道具 举报
谢谢,大家回复,已经懂了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马