前言
本文对java的io体系进行介绍。
1 总概
IO,Input/Output,输入和输出。
java的io处理分为两类,一类为字节流,一类为字符流。字节流处理的顶层接口为InputStream和OutputStream,字符流处理的顶层接口为Writer和Reader。
2 InputStream
本节对InputStream及其体系进行介绍。
InputStream体系关系如下图所示。
2.1 InputStream
输入流的父类,提供read方法从stream中读取字节,有三种类型的read方法。
read(),读取输入流的下一个字节,返回值为0到255,如果没有,则会返回-1。该方法一直block直到有数据可读。
read(byte b[]),从输入流中读取一定数量的字节,字节存储在一个字节数组中。该方法一直block直到有数据可读。
read(byte b[], int off, int len),从输入流中读取len长度的字节,字节存储到一个字节数组中,off为读取的第一个字节在字节数组中的位置。该方法一直block直到有数据可读。
2.2 ByteArrayInputStream
2.3 FileInputStream
FileInputStream,用于从File中读取字节,constructor可以是一个File对象,也可以是一个String,String表示的是File所在的路径。
2.4 PipedInputStream
PipedInputStream,管道输入流。一个管道输入流应该连接到管道输出流,然后管道输入流可以读取到写入到管道输出流中的数据。通常,一个线程可以从管道输入流中读取数据,而这些数据由其他对应的线程向管道输出流中写入。当连接到管道的线程不再alive时,管道将broken。
2.5 ObjectInputStream
ObjectInputStream,可以反序列化序列化到ObjectOutputStream中的obejct或者其他类型数据,提供readObejct方法,返回值为Obejct。
public static Object toObject(byte[] bytes) {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bais);
Object object = ois.readObject();
return object;
} catch(IOException ex) {
throw new RuntimeException(ex.getMessage(), ex);
} catch(ClassNotFoundException ex) {
throw new RuntimeException(ex.getMessage(), ex);
} finally {
try {
ois.close();
} catch (Exception e) {}
}
}
2.6 FilterInputStream
FilterInputStream,包含一些其他的输入流,其一些子类提供输入流处理的其他功能。其子类有BufferedInputStream,DataInputStream,PushbackInputStream,LineNumberInputStream。
BufferedInputStream,缓冲输入支持和支持mark、reset操作,缓冲通过内部的一个byte数组实现。
DataInputStream,支持应用程序从输入流中读取java的内部类型,例如int,char等。
PushbackInputStream,拥有一个Pushback缓冲区,可以将字节推回而重新读取。
LineNumberInputStream,已经Deprecated了。
2.7 其他
StringBufferInputStream,已经Deprecated。
SequenceInputStream,可以按顺序读取多个流。
3 OutputStream
OutputStream,输出流,提供write方法写入字节到流中。本节对OutputStream及其体系进行介绍。
OutputStream相关类如下图所示。