java将流分为两类:节点流与处理流(低级流与高级流)
- 节点流:也称之为低级流
节点流(低级流)的另一端是明确的,另一端是需要读写的数据,是实际读写数据的流,读写一定是建立在节点流基础上进行的。
- 处理流也称之为高级流
处理流不能独立存在,必须连接在其他流上,其他流可以是高级流(处理流),也可以是低级流(节点流),目的是当数据流警方当前流时,对数据进行加工处理来简化我们对数据的操作。
实际应用中,我们可以串联一组高级流到某个低级流上以流水线式的加工处理对某个设备的数据进行读写,这个过程也称之为流的连接,这也是io的精髓。
缓冲流
缓冲流是一对高级流(处理流),在流连接中,它的作用是加快读写速率。缓冲流中有一个默认8k的缓冲区。缓冲流总是块读写数据来提高读写效率。
java.io.BufferedOutputStream 缓冲字节输出流,继承java.io.OutputStream。
java.io.OutputStream是所有字节流的超类
常用构造器
- 创造一个默认8kb大小的缓冲区的缓冲输出字节流,并连接到参数指定的字节输出流上。
public BufferedOutputStream(OutputStream out) {
this(out, 8192);
}
- 创建一个size指定大小(单位是字节)缓冲区的缓冲字节输出流,并连接到参数指定的字节输出流上
public BufferedOutputStream(OutputStream out, int size) {
super(out);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
常用方法
flush():强制将缓冲区中已缓存的数据一次性写出
字节缓冲流的写出方法的工作原理与字节输出流的块写方法工作原理相同,调用write方法后并非实际写出,而是先将书v就存入缓冲区中,当缓冲区存满后会自动写出一次
public synchronized void flush() throws IOException {
flushBuffer();
out.flush();
}
对象流
对象流是一对高级流,在流连接中的作用是将对象的序列化和反序列化
序列化:是对象输出流的工作,将一个对象按照结构转换为一组字节的过程
反序列化:是对象输入流的工作,将一组字节和官员称对象的过程
对象输入流 ObjectInputStream 继承inputstream 也属于字节流
public class ObjectInputStream
extends InputStream implements ObjectInput, ObjectStreamConstants
常用的构造方法
创建一个对象输入流并连接到参数in这个字节输入流上
public ObjectInputStream(InputStream in) throws IOException {
verifySubclass();
bin = new BlockDataInputStream(in);
handles = new HandleTable(10);
vlist = new ValidationList();
serialFilter = ObjectInputFilter.Config.getSerialFilter();
enableOverride = false;
readStreamHeader();
bin.setBlockDataMode(true);
}
常用方法
进行对象反序列化,将对取的字节转化为一个对象并以object形式返回(多态)
如果读取到的字节表示的不是一个java对象,会抛出异常ClassNotFoundException
private String readString() throws IOException {
try {
return (String) readObject(String.class);
} catch (ClassNotFoundException cnf) {
throw new IllegalStateException(cnf);
}
}