Java把不同的数据源与程序间的数据传输都抽象为“流”,以实现相对统一而简单的输入/输出(I/O,Input/Output)操作方式。
I/O流的分类有多种方式:
- 按照数据流动的方向,可以分为输入流(InputStream)和输出流(OutputStream)。
输入流只能从中读取数据,而不能向其写出数据;而输出流则只能向其写出数据,而不 能从中读取数据。这里是站在程序的角度来确定出入方向,即将数据从程序外部传
送到程序中谓之“输入”数据。反之,为输出。
- 根据数据流所关联的是数据源还是其他数据流,可以分为节点流(Node Stream)和处理流(Processing Stream)。
节点流直接与数据源连接,处理流不直接连到数据源。
- 按照传输数据的“颗粒大小”划分,可分为字符流(Character Stream)和字节流(Byte Stream)。
凡是以InputStream和OutputStream结尾的类型均为字节流,凡是以Reader和Writer结尾的均为字符流。
基础I/O流类型
- InputStream
抽象类java.io.InputStream是所有字节输入流类型的父类,该类中定义了以字节为单位读取数据的基本方法,并在其子类进行了分化和实现。
InputStream类中定义的方法包括:
- <span style="font-size: small;">public abstract int read()
- 从此输入流中读下一个字节。字节值被转换为0-255之间的一个(无符号)整数返回,到达流的结尾无字节可读时将返回-1。
- public int read(byte[] b)
- 从此输入流中读取一定数目的字节并存入缓冲数组b。实际读取的字节数被作为一个整数返回,到达流的结尾无字节时将返回-1。
- public int read(byte[],int off, int len)
- 从此输入流中读取最多len个字节的数据到一个字节数组。它将尽可能去读取len个字节的数据,但可能只读取到较少数目的字节,实际读取的字节数被作为一个整数返回,到达流的结尾无字节可读时将返回-1。
- public void close()
- 关闭此输入流并释放任何与这个流相关联的系统资源。
- public int available()
- 返回此后从此输入流中还可以无阻塞地读取(或跳过)的字节数。
- public long skip(long n)
- 跳过并丢弃输入流中的n个字节数据。
- public boolean markSupported()
- 测试此输入流是否支持mark()和reset()方法。InputStream类的markSupported方法返回false,在其子类中产生了分化。
- public synchronized void mark(int readlimit)
- 标记此输入流中的当前位置。随后调用reset()方法时,将把这个流重置于最后一次标记的位置,从而使随后的读取重读同样的字节。参数readlimit指明输入流在标记位置失效前允许读多少字节。
- public synchronized void reset()
- 将此输入流重置于上一次在这个输入流上调用mark()方法时的位置。</span>
- OutputStream
java.io.OutputStream与java.io.InputStream是对应,是所有字节输出流类型的抽象父类。
- public abstract write(int b)
- 将b的二进制表示值低8位组成一个字节,写出到此输出流。
- public void write(byte b[])
- 将字节数组b中的全部b.length个字节一次写出到此输出流。
- public void write(byte b[],int off,int len)
- 将字节数组b中下表off开始的len个字节写入到此输出流。
- public void close()
- 关闭此输入流并释放任何与之相关联的系统资源。
- public void flush()
- 清空此输出流,即将任何被缓冲输出的字节立即发送到输出流中。
- Reader
抽象类java.io.Reader是所有字符输入流的父类,其中声明了用于读取字符流的有关方法。
- Reader 类中定义的方法有:
- public int read()
- 从此输入流中读取一个字符,并转换为0-65535范围的整数返回,到达流的结尾时返回-1。
- public int read(char cbuf[])
- 将字符读入数组cbuf,并返回实际读取的字符数,到达流的结尾时返回-1。
- public int read(char cbuf[],int off,int len)
- 将字符读入数组cbuf中从off开始的空间,每次最多读len个字符,返回实际读取的字符数,到达流的结尾时返回-1。
- public boolean ready()
- 判断此流是否准备好,如是,则可以进行读操作。
- 还有一些与InputStream类相似的。
- public abstract void close();
- public long skip(long n)
- public boolean markSupported();
- Writer
java.io.Writer与java.io.Reader类对应,是所有字符输出流类型的共同父类,也是一个抽象类,其中声明的方法如下:
- Writer类中定义的主要方法有:
- public void write(int c)
- 截取参数c二进制形式的低16位组成一个字符,并将其写出到当前对象所关联的数据源中。
- public void write(char cbuf[])
- 将数组cbuf中的字符依次写出。
- public void write(char cbuf,int off, int len)
- 将数组cbuf中下标off开始的len个字符写出。
- public void write(String str)
- 将字符串str中的全部字符依次写出。
- public void write(String str,int off,int len)
- 将字符串str中下标off开始的len个字符写出。
- public abstract void close()
- 关闭此输出流并释放任何与之相联系的系统资源。
- public abstract void flush()
- 清空此输出流,即将任何被缓冲输出的字符立即发送到输出流中。
- public void mark(int readAheadLimit)
- public void reset()