Java之IO(一)InputStream和OutputStream
转载请注明源出处:http://www.cnblogs.com/lighten/p/6964702.html
1.前言
计算机的IO操作一直都是比较重要的一环,IO顾名思义,就是输入输出流。不管是磁盘IO还是网络IO,数据流转就离不开IO,理解Java的IO操作类很重要,本文介绍IO的抽象父类InputStream和OutputStream,这是Java的IO操作基础,理解完抽象类,对于其它的IO流也有很大的帮助。
流都实现了Closeable接口,也就是都需要关闭。输出流额外实现了一个Flushable方法,主要是通知立刻将数据刷入指定输出地。
2.InputStream
1.read()方法是一个抽象方法,其是数据的读取源头,这个方法中要实现读取数据,返回读取的值。子类必须实现这个方法。
2.read(byte[])方法用处是将流的输入读入byte[]数组,其实际上调用的是read(byte[], int, int)。
3.read(byte[], int, int),将流读入byte[]数据的第off个位置开始,读取len个字节。
上述就是读入byte数组的全过程,先判断参数的正确性,再读取一个字节,如果是-1则返回-1(流以-1判断是否结束),然后放入数组的off位置,之后就循环读,三种情况返回:1将所给的数据读满了,2读取-1结束符,3出现读取异常。最后返回数组所读的数据个数。
4.skip(long),跳过指定个字节不读。
上述代码很清楚,创建了一个跳过的缓冲数据,将流读到这里面去,跳过的字节数有长度限制,为2048个。通过循环排除IO异常的感染,直到读完或者读满要跳过的,然后返回实际跳过的数量。
5.available(),返回估测的可读的数量,父类是直接返回了0。这个方法是对于所有流实现来说不都是准确的,所以慎用。这个方法需要被子类覆写。单次读或跳过很多字节不会阻塞,但是可能会读取或跳过少量字节。
6.close(),关闭流,没有具体实现。会释放操作系统资源
7.mark(int),标记读取位置,如果流实现支持,就可以重置位置,下次读取则一模一样。父类方法中什么都没做。使用之前要通过markSupported()方法判断一下是否支持。
8.reset(),reset到mark方法最后一次调用的位置。父类不止mark,所以直接抛出IO异常。
9.markSupported(),用于判读当前流是否支持标记流。与上两个方法配套使用。
3.OutputStream
1.write(int),抽象方法,通常是写入一个byte,低8位将写入,高24位会被忽略。将指定字节写入输出地,子类必须实现。
2.write(byte[]),实际上调用的就是方法3:write(b, 0, b.length);
3.write(byte b[], int off, int len),将字节数组b的其实位置off开始,写入len长度的字节
很简单的数组边界判定,通过循环调用write(int)方法。
4.flush(),强制刷新方法,将write写出的字节(此时不一定到了目的地如磁盘,可能在缓存中),调用flush方法让已写缓存字节强制到目的地。父类方法没有具体实现。但是此方法并不保证正在到了目的地,比如磁盘,文件流,这个方法只保证之前写入的数据到了操作系统的write方法,不保证操作系统完成了写这个步骤。
5.close(),关闭输出流。流关闭之后不能在输出字节,也不能再次打开。父方法是抽象方法。