I/O是机器获取或交换信息的主要渠道。
从JDK1.4开始引入了NIO(以块为单位传输数据,添加异步通信)。
从JDK1.7又添加了新特性NIO.2为该语言增加了异步通道功能和新的文件系统API。
把IO操作类分为四组
-
基于字节操作的 I/O接口:InputStream和OutputStream
-
基于字符操作的 I/O接口:Writer和Reader
-
基于磁盘操作的 I/O接口:File
-
基于网络操作的 I/O接口:Socket
前两组根据数据格式,后两组根据传输方式。我们关注的就是如何提高它的运行效率了,而数据格式和传输方式是影响效率最关键的因素了。
基于字节操作的I/O接口
一个是操作数据的方式是可以组合使用的,如:
OutputStreamout = new BufferedOutputStream(new ObjectOutputStream(newFileOutputStream("fileName"));
流最终会写到磁盘或者网络中(其实从上面的类图中我们发现,写网络实际上也是写文件,只不过写网络还有一步需要处理就是底层操作系统再将数据传送到其它地方而不是本地磁盘)。
我们来看一下jdk中InputStream抽象类的代码:
package java.io;
public abstract class InputStream implements Closeable {
// MAX_SKIP_BUFFER_SIZE is used to determine the maximum buffer size to
// use when skipping.
private static final int MAX_SKIP_BUFFER_SIZE = 2048;
// 是个抽象类需要子类实现
// return:int型 0-255(表示读出的那个字节)
// 如果是-1,说明读完了
public abstract int read() throws IOException;
// 一看就知道这个read用的就是再下面那个read的返回值
// 只是这个read是尽字节数组b最大的能力去read而已
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
// 这个read是不尽字节数组b最大能力去read,而是可以设置off和len
// return:0 表示len=0(一般不会出现)
// -1 用的是抽象函数read()的返回值,读完了
// (int)i 读出了i个字节
public int read(byte b[], int off, int len) throws IOException {
/**内容省略,自己查看 有调用read()那个抽象方法哦**/
}
public long skip(long n) throws IOException {
/**内容省略,自己查看**/
}
public int available() throws IOException {
return 0;
}
// Closeable接口的方法
public void close() throws IOException {}
// 配合reset()一起用
public synchronized void mark(int readlimit) {}
public synchronized void reset() throws IOException {
throw new IOException("mark/reset not supported");
}
public boolean markSupported() {
return false;
}
}
未完待续…………