几乎所有的程序都离不开信息的输入和输出,比如从键盘读取数据,从文件中获取或者向文件存入数据,在显示器上显示数据,以及在网络连接上进行信息交互时,都会涉及有关输入/输出的处理。在Java中,把这些不同类型的输入,输出源抽象为流,而其中输入或输出的数据称为数据流,用统一的接口来表示。
数据流是指一组有顺序的,有起点和终点的字节集合,程序从键盘接收数据或向文件中写数据,以及在网络连接上进行数据的读写操作,都可以使用数据流来完成。
1.输入数据流
输入数据流是指只能读不能写的数据流,用于向计算机内输入信息而用。java.io包中所有输入数据流都是由抽象类InputStream继承而来,并且实现了其中的所有方法,包括读取数据,标记位置,重置读写指针,获取数据量等。从数据流中读取数据时,必须有一个数据源与该数据流相连。
输入数据流中提供的主要数据操作方法有:
int read() int read(byte[]b) int read (byte[b],int off,int len)
以上三个函数提供了访问数据流中数据的方法,函数所读取的数据都默认为字节类型。其中最简单的是第一个read()方法,它从输入流中读取一个字节的二进制数据,然后以此数据为低位字节,配上一个全零字节形成一个从0到255之间的整数返回。它是一个抽象方法,需要在子类中具体实现。当输入流读取结束时,它会得到-1,以标志数据流的结束。第二个read方法将多个字节读到数组中,填满整个数组。第三个read方法从输入流中读取长度为len的数据,从数组b中检索为off的位置开始放置读入的数据,读毕返回读取的字节数。
void close()当结束对一个数据流的操作时应该将其关闭,同时释放与该数据流相关的资源,用到的方法即是close(),要注意的是,因为Java提供系统垃圾自动回收功能,所以当一个流对象不再使用时,可以由运行时系统自动关闭,我们也可以养成关闭输入输出流的习惯。
int available()该方法可以返回目前可以从数据流中读取的字节数。
long skip(long I)该方法跳过数据类中指定数量的字节不读,返回值表示实际跳过的字节数。
对数据流中字节的读取通常是从头到尾顺序进行的,如果要以反方向读取,则需要使用回推(push back)操作,方法boolean markSupported()用于指示数据流是否支持回推操作,当一个数据流支持mark()和reset()方法时返回true,反之则返回false。方法mark()用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小,在执行完随后的read操作后,调用方法reset将回到输入数据流中被标记的位置。
2.输出数据流
输出数据流是指只能写不能读的流,用于从计算机中输出数据。
与输入流类似,java.io包中所有输出数据流大多是从抽象六OutputStream继承而来,并且实现了其中所有方法,这些方法主要是提供了关于数据输出方面的支持。
void write(int i)该方法的含义是将字节i写入数据流中,它只输出低位字节,该方法是抽象方法,需要在其输出流子类中加以实现,然后才能使用。
void write(byte b[])该方法的含义是将数组b中全部的b.length个字节写入数据流。
void wrute(byte b[],int off,int len)该方法的含义是将数组b中从第off个字节开始的len个字节写入数据流。
void close()当结束时对输出数据流的操作,应该将其关闭,这与输入数据流非常相似。
上面提到的InputStream和OutputStream两个类都是抽象类,我们已经知道,抽象类是不能进行实例化的,因此在实际使用中经常使用到的并不是这两个类,而是一系列基本数据流类,它们都是InputStream和OutputStream的子类,在实现其父类方法的同时又定义了其特有的功能,我们下一篇文章将会介绍一些常用的基本数据流。