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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨玉辉 于 2013-3-24 15:38 编辑

如题,IO流就是通过字节流的操作,实现的运算,Reader 和 Writer 只是在间接地操作字节流,字节运算才是根本
   在java虚拟机调用,系统底层资源,如 内存,硬盘,键盘,控制台;

键盘录入的是纯文本,但是设备录入的却是字节流,在底层通过调用并查编码表,将录入的文本录入系统。分如下情况:

一个硬盘文件是以字节的方式存储进来的,是不是通过默认的编码表(中文系统 是 GBK),将这些字节以文本的形式存储的呢?但是操作时,还是以字节的方式操作吗?
当然,FileReader可以直接读取(就是因为FileReader 封装了InputStreamReader(“文件”,“GBK”),将字节转换成字符时的默认编码表,但是绝对不可以更改这里的编码表,否则系统文件显示就会乱码),
问题就在这儿,想要操作这个读取流文件,FileWriter 里面的write()方法,应该也是操作的字节流,里面是否同时也封装了OutputStreamWriter(“目的文件”,GBK),同时系统存储时也会查找默认的编码表,以字符的形式存在,那么我指定了“UTF-8”编码表,这个时候没有乱码,是否就是说,“UTF-8”,兼容了“GBK”,硬盘文件也是以字节的形式显示出来存储的,只是在操作时候,底层还是操作的字节流,用FileReader 操作,也是在底层实现了从字节到字符的转换

所以归根结底计算机无论输入输出,操作的都是字节流,不同的只是一些IO设备驱动,在系统底层实现了,字节<——>字符 的转换,在界面操作的字符,实际上却是通过查表进行的是字节的运算

不知道这种观点,是否正确?

再来看这段代码是否明朗

// OutputStream out = System.out;
//                OutputStreamWriter osw = new OutputStreamWriter(out);   //字符->字节  其实底层通过查表,以字符的形式体现并显示出来而已,字节流缓冲区就是在做着查表的动作
//                BufferedWriter bufw = new BufferedWriter(osw);
                   BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out)); //这样的话,就可以理解字符流,在系统的底层 操作字节流 ,查表后,再来操作字符流,就很容易了吧



评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
看你写了这么长,一句话就回答了你的第一个问题
计算机处理数据都是使用的二进制的形式,就是0和1,所谓字节就是规定了8位bit为一个byte
不同的字符码表只是编码方式的不同,计算机的CPU运算不认识字符,只认识0和1

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
看你写了这么长,一句话就回答了你的第一个问题
计算机处理数据都是使用的二进制的形式,就是0和1,所谓字节就是规定了8位bit为一个byte
不同的字符码表只是编码方式的不同,计算机的CPU运算不认识字符,只认识0和1
回复 使用道具 举报
马利 发表于 2013-3-24 13:30
看你写了这么长,一句话就回答了你的第一个问题
计算机处理数据都是使用的二进制的形式,就是0和1,所谓字 ...

楼上正解,对于初学者,要是学过计算机系统,可能会比较好理解些
回复 使用道具 举报
呵呵,这个问题,只是在说,Reader , Writer  是怎么将字符 等 ,我们常见的 文件,进行运算处理的,没有否认计算机的意思,旨在说明,键盘录入的的确是字节流,之所以会看到字符流,那是底层的系统处理出来的。都知道,计算机只处理二进制数据。
具体是怎么实现的呢,我也只是发表了,以前我所不知道,现在通过IO流转换机制,才弄明白的一点事情。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马