Java中字符流和字节流的区别以及主要的I/O体系

来源:互联网 发布:usb编程案例 编辑:程序博客网 时间:2024/05/16 12:41

I/O类是所有语言最常用的类之一,以前一直被java的I/O的各种类和其继承体系搞得比较乱,因为C++中的I/O标准类相对没java这么多,比较简洁。现在对java的I/O体系做一次简洁但是有效地归纳。

总而言之,java的I/O体系可以用美国两党制的模式来对照,分成共和党和民主党,就是字节流(OutputStream、InputStream)和其子类们(所谓的子类们一眼就能看得出,就是类名最后以OutputStream或者InputStream结尾),字符流(Writer、Reader)和其子类们(类名最后以Writer或者Reader结尾,比如FileWriter,明显是字符输出流的子类),还有一个绿党,那就是File类和其子类,这就是用来操作目录和文件的。

所谓的字符流是指该流类的读写是以字符为单位进行

所谓的字节流是指该流类的读写是以字节为单位进行

Java的I/O体系之所以比较复杂,归根结底跟java的字符类型char的编码有关,为什么C++没有分字节流和字符流得区分呢,那就是,C++的char类型是ascii编码,一个char变量只占用8个位一个字节,也就是说对于C++而言,一个字符就等于一个字节,所以对C++而言字符流跟字节流没什么区别。但是java不同,java采用了Unicode编码,这种编码的好处就是一个字符char能表示的语言文字比ascii码多的多,但是占用内存也增加,占用了两个字节,16位。所以就出现了所谓字符流和字节流的区分,一般读写文本文件使用字符流进行操作,但是处理二进制的图像之类的数据就用字节流处理。

记住这个原因,就能时时刻刻记住java的I/O体系为什么分成字符流和字节流,再加上一个File类,基本上代码中常用的I/O操作类就能了然于胸了,不会被纷杂的I/O类搞得无所适从。

在这里有个地方值得一提,就是为了加快字符流的读写速度,java给其加了小灶,增加了缓冲区,而字节流则没有,所以操作字符流时要常记得主动去刷新flush。当然字节流的子类也可以加上缓存区加快字节读取速度,总而言之,字符流是从源头父类就自带缓存区的,而字节流需要自己奋斗才能带上缓存区。

0 0
原创粉丝点击