任何程序都离不开信息的输入|输出。例如:从键盘输入数据,从网络上获取数据,读取或写入文件等。在java语言中输入、输出是通过流来实现的。相关类全部封装在java.io包中。
流的分类
a)就数据的读取或写入而言流可以分为输入流(InputStream)或输出流(OutputStream)两大类。输入流只能读不能写,输出流相反。输入或输出都是相对于程序而言的。例如:程序从文件中读取数据叫输入流,程序向文件中写数据称作输出流。InputStream,OutputStream均直接继承自Object,且都是抽象类。
b)按处理数据的单位不同可以分为字符流(Reader\Writer)和字节流(InputStream\OutputStream)。
c)按照功能不同可以分为节点流和处理流。节点流是可以从一个特定的数据源(节点)读写数据(如:文件、内存)。处理流是套接在已存在的流(节点流|处理流)之上通过对数据的处理提供更强大的功能。
一、字节流
A)输入流
备注:左图中背景为深色的节点流,浅色的为处理流
InputStream类派生 图
InputStream类是一个抽象类,包含一套所有输入都需要的方法,可以完成最基本的从输入流读入数据的操作。其中常用的方法见下表。
方法 | 描述 |
public InputStream() | 构造方法,子类调用 |
public int read() | 从当前位置读入1字节的二进制数据返回值是0-255之间的一个整数,该方法是抽象的。 |
public int read(byte b[]) | 从输入流中读取长度为b.length的数据并存入数组b,返回值为读取的字节数 |
public int read(byte b[],int off,int len) | 从输入流中的当前位置读取len个字节并存入数组b中从下标off开始的位置,返回值为读取的字节数 |
public int available() | 返回值为输入流可读取的字节数 |
public void mark() | 在输入流的当前位置作标记 |
public void reset() | 将位置指针返回到标记位置 |
public long skip(long n) | 将输入流中当前位置向后移动n个字节,返回值为跳过的字节数 |
public void close() | 关闭输入流 |
注意:在使用完后,用显示的调用close()方法关闭流。
当程序需要从外部设备如磁盘、键盘等读入数据时,需建立一个相应类型的输入流对象来与设备建立连接。最后通过调用某个合适的输入流对象的read方法完成数据的输入操作。
B)输出流
备注:左图中背景为深色的节点流,浅色的为处理流
与InputStream对应的OutputStream也是一个抽象类,其中定义了完成最基本的从输出流写入数据的方法。常用方法如下表:
方法 | 描述 |
public OutputStream() | 构造方法 |
public write(int b) | 将数据b写入输出流,抽象方法,由子类实现 |
public write(byte b[]) | 将字节数组中的全部数据写入写入输出流 |
public int write(byte b[],int off,int len) | 将字节数组中下标从off开始的的长度为len字节的数据写入输出流 |
public void flush() | 强制清空缓冲区并输出所有被缓冲的字节 |
public void close() | 关闭流 |
注意:flush():对于缓冲流式输出,write不是直接将数据写入到与之相连的设备上,而是先输出到一个缓冲区中,到缓冲区满时再一次性写入相应的设备中。这样做可以减少cpu对外部设备的读写次数,提高系统效率。
当Java程序需要向外部设备写入数据时,需要先与外部设备建立一个相应类型的输出流连接。通过该连接的write实现数据的输出操作。
二、字符流
A)输入流Reader
Reader类是定义Java字符流输入模式的抽象类。主要方法见下表:
方法 | 描述 |
public abstract void close() | 关闭流 |
public int read() | 读取流中的一个字符 |
public int read(char[] cbuf) | 读取一系列字符到字符数组cbuf中 |
public abstract int read(char[] cbuf,int off,int len) | 读取len个字符存放到字符数组cbuf中下标从off开始的位置 |
public long skip(long n) | 跳过n个字符 |
public boolean ready() | 测试流是否已准备好是否可以读取字符 |
public boolean markSupported() | 测试流是否支持mark()操作 |
public void mark(int numChars) | 在流的当前位置作标记,最多可回溯numChars个字符 |
public void reset() | 将流标记重置到上次作标记处 |
B)输出流Writer
Writer类是定义Java字符流输出模式的抽象类。主要方法见下表:
方法 | 描述 |
public abstract void close() | 关闭流 |
public void write(int c) | 向流中写入一个字符,写入字符存放于c的低16位中 |
public void write(char[]cbuf) | 将字符数组中的内容写入流 |
public abstract 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 flush() | 强制清空缓冲区并输出所有被缓冲的字符 |
public void reset() | 将流标记重置到上次作标记处 |
注意:因为Reader,Writer类是抽象类,所有其中的方法不能直接使用,而是通过其派生类:FileReader和FileWriter;BufferedReader和BufferedWriter类。
最后再附一张java io总体派生图:
声明:某些内容收集自互联网加以整理。