day12
NIO
java.nio.ByteBuffer,这个类有写模式和读模式,区别在于我们对缓冲区写后,limit处于最大的分配长度,需要调用flip()用来改为读模式,这样limit就为我们写入的实际数据的长度,并且开始的位置归到0。
缓冲器有四个标志:
mark
position
limit
capacity
内存映射文件
|
|
通过调用getChannel返回一个通道,然后调用map方法,指定映射的范围,返回一个MappedByteBuffer类缓冲器,可以进行所有缓冲器的操作。
测试性能代码:
|
|
性能上来说,映射读写速度远大于缓冲io,不过容易频繁换页。
对象序列化
目的:对象在进程结束后自动销毁,为了让对象能继续存在使得下一次运行程序能直接使用。
用途:支持两种特性,一是Java的远程方法调用,使得存活于其他计算机上的对象使用起来就像是存活于本机上一样,当向远程对象发送消息时,需要通过对象序列化来传输参数和返回值。二是在JAVAbeans中的应用。
注意,对象序列化关注对象的“状态”,不会关注对象的静态变量。
下面是一个存储、恢复实例,用到了一个worm类能迭代引用多个worm,这个例子说明了恢复时不仅能恢复对象本身的状态,还能恢复对象引用的其他对象的状态。
|
|
可以从结果看到,整个过程没有调用任何构造器,对象直接从数据中恢复过来。
另外,我们在用序列化文件还原某个对象时,一定要有该对象的.class文件能被虚拟机找到。
序列化控制
考虑安全问题,希望序列化的对象中一部分内容不进行序列化,需要用Externalizable接口,这个接口继承了Serializable接口并增加了两个方法,*而且不同与前者的是,这个接口读取序列化对象时一定调用默认构造器,如果构造器没有public的话会报异常。下面这个例子展示了如何序列化部分内容:
|
|
可以看到,我们需要实现两个方法writeExternal(ObjectOutput)和inputExternal(ObjectInput),在这两个方法中自己来定义要序列的内容和读取的内容。
transient
如果对继承了Serializable接口的对象中部分内容不想序列化,就得使用transient(瞬时)关键字来指定内容不可序列化。
|
|
从结果发现,密码的引用是null,因为没有被存储,也不会被反序列化,对象引用如果是null,自动转成null字符串。