在上篇文章(点击打开链接)中我介绍了File类的使用方法,我们可以利用File类创建删除目录和文件等操作。但是更多的是我们想读取数据,或者写入数据,这个是File类做不到的。在Java中利用输入流和输出流来解决写入和读取的工作。
流(Stream)是字节的源或目的,我们可以把流想象成我们现实生活中的水流,我们需要水的时候在自来水管里取水,我们想要把水倒掉的时候,我们就将其倒到了下水管道里。这里的自来水管就类似Java中的输入流,在里面我们可以读取数据。下水管道就类似Java中的输出流,我们可以向里面写入数据。所以我们说,可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。
流分为节点流和过滤流。节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。过滤流可以给我们提供功能的增强。 在Java中给我提供了一个抽象的基类InputStream。在这个类中有几个方法我们介绍一下:三个基本的读方法:
abstract int read() :读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。如果我读入了一个大于一个字节的数据,那么只有第一个字节是有用的。
int read(byte[]b) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
int read(byte[]b, intoff,intlen) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
其它方法
long skip(longn) :在输入流中跳过n个字节,并返回实际跳过的字节数。
int available() :返回在不发生阻塞的情况下,可读取的字节数。
void close() :关闭输入流,释放和这个流相关的系统资源。
void mark(intreadlimit) :在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。
void reset() :返回到上一个标记。
boolean markSupported() :测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。
下面我们以图表的形式给出这个类的层次:
这里对于这些类的层次结构,我们不用刻意去背,等到我们用的多了,我们渐渐的也就都记住了。
下面我们介绍一下OutputStream类,这个类也是抽象的,它里面提供了一些方法我们需要记住:
三个基本的写方法
abstract void write(intb) :往输出流中写入一个字节。
void write(byte[]b) :往输出流中写入数组b中的所有字节。
void write(byte[]b, intoff,intlen) :往输出流中写入数组b中从偏移量off开始的len个字节的数据。
其它方法
void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
void close() :关闭输出流,释放和这个流相关的系统资源。
下面我们以图表的形式给出这个类的继承层次结构:
对于InputStream和OutputStream这两个类的方法还有很多,我们可以参照Java的帮助文档学习。
如果哪里写错了,请直接指出。