I/O类概述

Java的I/O类主要是由InputStream,OutputStream,Reader,Writer类组成。这些类有很多子类,提供了更为丰富的功能。InputStream类和OutputStream类用于对字节和二进制的处理,Reader,Witer类用于对字符或者字符串对象的处理。接下来一一介绍。
InputStream/OutputStream类
提供字节流的输入输出方法的抽象类。所有方法出错时都会抛出IOException。
InputStream的方法:

方法

描述

read

从输入流中读取字节,返回读取字节数,如果遇到结尾就返回-1

available

返回可读取的字节数

mark

标记当前读取位置

reset

跳转到mark标记位置读取

markSupported

是否支持mark/reset方法

skip

从当前位置跳过一定字节数,返回成功跳过的字节数

close

关闭输入流

OutputStream的方法

方法

描述

write

写字节或者字节数组到输出流中去

flush

将缓存中的数据写入到输出流,如果有的话

close

关闭输出流,如果有缓存数据自动flush

Reader/Writer类
提供对字符流的输入输出处理的抽象类。读写一个Unicode序列。方法在错误时也会抛出IOException。
Reader类方法除了有inputStream类方法之外还有如下:

Reader类方法

描述

ready

输入请求是否准备好

Writer类方法和outputStream方法类似。

字节/字符流之间转换:
InputStreamReader/OutputStreamWriter两个类提供了InputStream到Reader的转换和OutputStream到Writer的转换。

文件I/O
用来处理文件的类,主要包括FileInputStream、FileOutputStream、FileReader、FileWriter类。

FileInputStream/FileOutputStream
这两个类继承自InputStream类和OutputStream类。提供了额外的方法。

FileInputStream类和FileOutputStream类方法

描述

getChannel

获得与此文件输入流对应的FileChannel

getFD

获取该文件的FileDescriptor

注意FileOutputStream如果不用FileOutputStream(String name,boolean append)或者FileOutputStream(File file,boolean append)实例化,文件写的时候将会导致该文件原有内容被删除。append用true表示在文件末尾追加。
FileReader和FileWriter类
这两个类继承自InputStreamReader类和OutputStreamWriter类。没有重载所继承类的任何方法。对文件的字符输入输出的处理。
字节数组处理:
ByteArrayInputStream,ByteArrayOutputStream提供了对字节数组的输入输出。重载了InputStream类、OutputStream类里的方法。
ByteArrayOutputStream类新增了一些方法:

ByteArrayOutputStream类方法

描述

size

返回缓冲区的字节数

reset

清除缓冲区

toByteArray

将ByteArrayOutputStream的数据作为一个字节数组返回

CharArrayReader类CharArrayWriter类
与上边两个类类似,支持字符组数的I/O操作。方法也类似。
有toCharArray方法。

StringReader类和StringWriter类
从String中读取字符,写字符串到StringBuffer中去。
StringWriter类有个方法就是getBuffer方法。返回已写入数据的StringBuffer对象。

SequenceInputStream
将两个或者多个InputStream类一次读取。该类的典型应用是将两个文件合并。

JAVA对象的I/O操作
针对对象的输入输出操作的类主要有DataInputStream、DataOutputStream、ObjectInputStream、ObjectOutputStream类。

DataInputStream类/DataOutputStream类
这两个类实现了DataInput接口和DataOutput接口。这两个接口里面的方法主要是对java基本数据的读写操作。一般为readX和writeX。X表示基本数据类型。例如:readBoolean,writeString等等方法。因此这两个类拥有这两个接口的所有方法。可以实现对基本数据类型的I/O处理。

ObjectInputStream/ObjectOutputStream类
这两个类提供了往流中写入对象和从流中读出对象的方法。
串行化:
将一个对象的状态写入字节流中的过程称之为并行化。对象在程序运行之外存在的能力成为持久化。而串行化是持久化的关键。只有实现了可串行化的对象才可以在字节流中存取。而实现可串行化只需要实现其可串行化接口即可。该接口没有方法,但要确保这个类中的变量要么是简单类型,要么本身可串行化(一些预定义的类是可串行化的)。
注意:声明为transit或者static的变量不能通过串行化手短保存。

ObjectInput接口/ObjectOutput接口
这两个接口扩展了DataInput接口和DataOutput接口,即拥有对基本数据类型的读写处理操作。

ObjectInput接口方法

描述

read

从输入流中读取字节,返回读取字节数,如果遇到结尾就返回-1

available

返回可读取的字节数

skip

从当前位置跳过一定字节数,返回成功跳过的字节数

close

关闭输入流

ObjecOutput接口方法

描述

WriteObject方法

将对象写入到流中

flush

结束输出状态,缓冲区被清空

close

关闭流

ObjectInputStream类和ObjectOutputStream类
实现了对对象到流的解串行化和串行化过程。其中ObjectOutputStream类实现对象串行化过程,将写入到流中。ObjectInputStream类读流中的串行化后的对象,进行解串行化过程,返回对象为Object类型,可以强转为对应类型。

Externalizable接口提供了对对象串行化过程的控制。有readExternal方法和writeExternal方法。可以自行扩展串行化过程。

过滤I/O
FilterInputStream类和FilterOutputStream类。这两个类为抽象类。作为装饰器的接口。

FilterInputStream类子类

FilterOutputStream类子类

DataInputStream类

DataOutputStream类

BufferedInputStream类

BufferedOutputStream类

LineNumberInputStream类

LineNumberOutputStream类

PushbackInputStream类

PushbackOutputStream类

PrintStream类
该类为过滤器,其中System.out对象就是该类的实例。该类提供了print和println方法。
PrintWriter类
PrintStream类的面向字符的替代品。

PushbackInputStream类
该类为过滤器。能够实现读出字节再将读出的字节反写入字节流中。由unread方法提供该功能。
PushbackReader类
与上边一样提供了字符的反写入。由unread方法提供。

缓冲I/O
用来改善在读写大量的字节/字符数据的时候的性能。主要类有bufferedInputStream类bufferedOutputStream类、bufferedReader类和bufferedWriter类。

RandomAccessFile类
提供了随机位置读写二进制数据,唯一一个不是由InputStream类或者OutputStream类衍生而来的类。实现了DataInput接口和DataOutput接口。除了这两个接口的方法外还实现了方法:

方法

描述

seek

设置当前位置为文件的任意位置

getFilePosition

返回当前位置

length

返回文件当前长度