1, RandomAccessFile
read/write/seek都是native实现,随机读写文件。
2, Stream
经典IO流,根据数据存储方式分为:byte array,file,socket,pipe,object(对象序列化)。
Filter装饰设计模式添加功能,例如Buffered缓存
3, 序列化
所有支持序列化的类必须实现Serializable接口,原因是避免序列化一个类时,无限制的序列化类。反序列化时必须有public无参构造方法。
3.1 默认序列化:必须有无参构造。序列化所有基础数据类型,递归序列化所有引用类型。除非用transient关键字阻止序列化。
3.2 自定义序列化和反序列化
private void writeObject(ObjectOutputStream oos)
private void readObject(ObjectInputStream ois)
当序列化或反序列化时遇到这俩方法,忽略默认序列化机制,调用这俩方法实现序列化和反序列化。
ObjectOutputStream#defaultWriteObject,ObjectInputStream#defaultReadObject这两个方法可以实现标准的序列化行为,可以调用read/write序列化静态和transient状态。
3.3 实现Externalizable接口
实现void writeExternal(ObjectOutput out)和void readExternal(ObjectInput in)
优先级 3.3 > 3.2 > 3.1
4, 标准io
public static final InputStream in;
public static final PrintStream out;
public static final PrintStream err;
可以使用System类的setIn、setOut、setErr实现io重定向。
5, reader、writer
5.1 OutputStreamWriter把OutputStream转为writer,InputStreamReader把InputStream转为reader,可以指定编码格式,默认为file.encoding系统属性。
6, nio
6.1 buffer:读写使用同一个指针。
flip:limit=position;position=0;mark=-1; 写完之后读之前要flip一下
rewind:position=0;mark=-1;倒回去。
DirectByteBuffer:由操作系统分配空间,操作系统可以直接访问,性能更好。咋释放的?
当DirectByteBuffer没有强引用时,会成为幻影引用,然后在gc回收时释放堆外内存。
6.2 channel:表示一个打开的连接。Channel都从对应的InputStream、OutputStream实例创建。ServerSocketChannel#open例外。
6.3 selector