一 接口分类
基于字节操作的 I/O 接口:InputStream 和 OutputStream
基于字符操作的 I/O 接口:Writer 和 Reader
基于磁盘操作的 I/O 接口:File
基于网络操作的 I/O 接口:Socket
PS为什么需要字符操作,I/O所有的操作都是基于字节(因为计算机最小存储单位是字节),提供基于字符的操作只是因为我们代码中常用的是字符,仅仅为调用方便。
二 字符和字节的转化
1 java I/O所有的操作都是基于字节,在读取和写入的时候就需要字节和字符之间的转化
2 读字符的时候用到的是StreamDecode,最后用的是CharsetDecoder的decode方法
最后的实际就是,字符+编码去查码表得到二进制数(例如:字符串"3".getBytes()得到是51,查看utf-8的编码表后字符3就是对应的51)
三 JAVA I/O的初始化使用了包装器模式
四 注意的地方
1 用完就关闭,以免资源泄露
关闭流的时候,只有文件流和socket中有本地方法close0(),所以我认为只用关闭最内层的流即可;不论先关闭内层和外层的流,再去读写的时候都会报stream closed的错
2 用缓冲流一次读写多个字节更快
(1)缓冲流定义了一个byte[] buffer数组,如果没有指定大小,初始化是2^13 = 8192;
(2)每次写操作的时候判断buffer数组:
length > buffer.lenfth 全部写完
如果能填充完buffer就写,多余的继续保存在buffer中
Most of the examples we've seen so far use unbuffered I/O. This means each read or write request is handled directly by the underlying OS
To reduce this kind of overhead, the Java platform implements buffered I/O streams. Buffered input streams read data from a memory area known as a buffer; the native input API is called only when the buffer is empty. Similarly, buffered output streams write data to a buffer, and the native output API is called only when the buffer is full.