InputStream
1.abstract int read(); 这个方法读入一个字节,并返回读入的字节,如果在遇到输入源结尾是返回-1
InputStream类还有其他非抽象方法,比如read(byte[]) 读入一个字节数组,或者跳过大量的字节skip(long),这些方法都调用read()方法。
OutputStream
和InputStream差不多,定义了
abstract void write(int b); 他可以向某个位置写出一个字节。
read和write方法在执行时都讲阻塞,直到字节确实被写出或者读入,这就意味如果流不能 被立即访问(通常是因为网络连接忙),那么当前的线程被阻塞。
available方法使我们可以去检查当前可读入的字节数量。
有1个办法保证不可能被阻塞
int num = in.available();
if(num>0){
byte[] data = new byte[num];
in.read(data);
}
当完成流的读写是,应该通过调用close方法来关闭它,这个调用会释放十分有限的操作系统资源,关闭输出流的同时还会冲刷用于输出流的缓存区:
所有被临时置于缓冲区中,以便用更大的包的形式传递的字符在关闭输出流程是都将被送出。特别是,如果不关闭文件,那么写出字节的最后一个包
可能将永远也得不到传递,当然,我们还可以用flush人为的冲刷这些输出
InputStream中的方法。
abstract int read() 从数据中读入1个字节,并放回改字节,这个read方法在碰到流的结尾时返回-1
int read(byte[] a) 读入一个字节数组,并返回实际读入的字节数,或者碰到流的结尾时返回-1,这个read 方法最多 对人 a.lenth个字节。
int read(byte[] a, int offset,int len)读入一个字节数组,并返回实际读入的字节数,或者碰到流的结尾时返回-1
a:数据读入的数组
offset 第1个读入字节应该被放置位置为a重的偏移量
len 读入字节的最大数据
long skip(long n) 在输入流跳过n个字节,放回实际跳过的字节数,如果碰到流的结尾,则可能小于n,但是自己本地测试,好像不是。
int available(),返回在不阻塞的情况下可获取的字节数
void close 关闭这个输入流
void mark(int readlimit)在输入流的当前位置打一个标记。
void reset() 返回到最后一个标记
outputstream
1.abstract void wirte(int b)
2.void write(byte[] b)
3.void write(byte[] b ,int offset,int len)
4.void close();
5.void flush();
InputStream和OutputStream 类可以读写单个字节或者字节数组,要想读写字符串或者数组,就需要更强大的子类,
比如DataInputStream 和 DataoutputStream 可以已二进制格式读写所有的基本java类型
比如我们直接读取字符,数字等等。
DataInputStream 能与机器无关的方式,直接重字节输入流读取java基本类型和String类型
DataInputStream 是继承FilterInputStream,这时候就要说到经典的装饰着模式。