本帖最后由 杨玉辉 于 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)); //这样的话,就可以理解字符流,在系统的底层 操作字节流 ,查表后,再来操作字符流,就很容易了吧
|