数据流
输入输出(input/output,I/O)技术用于处理设备之间的数据传输,指程序与外部设备或其他计算机进行数据交换的过程,比如读/写文件、网络通信等。针对程序而言,将外部数据(磁盘、光盘等存储设备的数据)读取到程序(内存)中称为输入,将程序(内存)数据输出到磁盘、光盘等存储设备中称之为输出。
Java程序中,对于数据的输入输出操作以“流”(steam)的方式进行。java.io包下提供了各种“流”的类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。Java中的I/O流按数据流的流向不同分为输入流和输出流;按照操作数据单位不同分为字节流和字符流;按流的功能可分为底层的节点流和上层的处理流两类。节点流直接从数据源或目的地读写数据,而处理流不直接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
Java的输入输出流体系提供了几十个类,下面按照功能将常用流进行分类梳理,如下表所示:
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象父类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问管道 | PipedInputStream | PipedOutputStream | CharArrayReader | CharArrayWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
装饰流 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
数据过滤流 | DataInputStream | DataOutputStream |
字符流只能读取纯文本文档(txt)。不能读取doc
字节流是万能流。
InputStream和Reader时所有输入流的基类,OutputStream和Writer时所有输出流的基类。InputStream和OutputStream是字节流的抽象父类,以字节位单位进行I/O操作,Reader和Writer是字符流的抽象父类,以字符为单位进行I/O操作。
InputStream类
InputStream用来表示那些从不同数据源产生输入的类,这些数据源包括字节数组(ByteArrayInputStream)、字符串(StringBufferInputStream)、文件(FileInputStream)、管道(PiledInputStream)、流序列(SequenceInputStream)以及网络连接。InputStream类中定义的集中常用的方法。
(1)int read(),从输入流中读取数据的一个字节,返回0-255范围内的int字节值。如果因为已经达到流末尾而没有可用的字节,则返回值为-1.
(2)int read(byte[ ] b),从输入流中将最多b.length个字节的数据读入一个byte数组中,以整数形式返回实际读取的字节数。如果因为已经达到流末尾而没有可用的字节,则返回值为-1.
(3)int read(byte[ ] b,int off,int len),将输入流中最多len个数据字节读入一个byte数组。尝试读取len个字节,但读取的字节也有可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值为-1.
(4)public void close( ) throws IOException,关闭次输入流并释放与该流关联的所有系统资源
OutputStream类
OutputStream表示输出要去往的目标,如字节数组(ByteArrayOutputStream)、文件(FileOutputStream)或者管道(PiledOutputStream)。OutputStream类中定义的集中常用方法:
(1)void write(int b),将指定的字节写入此输出流。要写入的字节是参数b的8个低位,b的24高位将被忽略即写入范围为0-255。
(2)void write(byte [ ] b),将b.length个字节从指定的byte数组写入此输入流。
(3)void write(byte[ ] b,int off,int len),将指定byte数组中从偏移量off开始的len个字节写入此输出流。
(4)public void flush( ) throws IOException,刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示将这些字节立即写入它们预期的目标。
(5)public void close( ) throws IOException,关闭此输出流并释放与该流关联的所有系统资源。
Reader类
Reader类中定义了以下几个常用的方法:
(1)int read( ),从输入流中读取单个字符。Java采用Unicode编码为每个字符分匹配2字节的存储空间,故reader()方法将返回读取的2字节字符数据的Unicode编码。如果已到达流的末尾,则返回-1。
(2)int read (char[ ] cbuf),从输入流中最多读取cbuf.length个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数。如果已到达流的末尾,则返回-1。
(3)int read( char[ ] cbuf,int off,int len),从输入流中最多读取len个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数。如果已经达流的末尾,则返回-1。
(4)public void close( ) throws IOException,关闭此输入流并释放与该流关联的所有系统资源。
Writer类
Writer类中定义以下几个常用方法:
(1)void writer(int c),将单个指定字符输出到指定的输出流。
(2)void writer(char[ ] cbuf),将字符数组cbuf中的数据输出到指定的输出流。
(3)void writer(char[ ] cbuf,int off,int len),将字符数组cbuf从off位置开始的len个字符输出到指定流。
(4)void writer(String str),将str字符串中的字符输出到指定输出流。
(5)void writer(String str,int off,int len),将str字符串中从off位置开始的len个字符输出到指定输出流。
(6)void flush( ),刷新该流的缓冲。
(7)public void close( ) throws IOException,关闭此输出流并释放与该流关联的所有系统资源。