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 | 返回文件当前长度 |