IO

作者: 码农崛起 | 来源:发表于2018-05-04 17:55 被阅读0次

1, RandomAccessFile
read/write/seek都是native实现,随机读写文件。
2, Stream


OutputStream.png InputStream.png

经典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


writer.png reader.png

5.1 OutputStreamWriter把OutputStream转为writer,InputStreamReader把InputStream转为reader,可以指定编码格式,默认为file.encoding系统属性。

6, nio
6.1 buffer:读写使用同一个指针。


buffer.png

flip:limit=position;position=0;mark=-1; 写完之后读之前要flip一下
rewind:position=0;mark=-1;倒回去。

DirectByteBuffer:由操作系统分配空间,操作系统可以直接访问,性能更好。咋释放的?


DirectByteBuffer.png Cleaner.png

当DirectByteBuffer没有强引用时,会成为幻影引用,然后在gc回收时释放堆外内存。
6.2 channel:表示一个打开的连接。Channel都从对应的InputStream、OutputStream实例创建。ServerSocketChannel#open例外。


channel.png

6.3 selector


教科书式demo.png

相关文章

网友评论

      本文标题:IO

      本文链接:https://www.haomeiwen.com/subject/vavplftx.html