《疯狂的JAVA讲义》笔记-第15章输入输出
- 序列化
- 由于远程调用时需要将对象进行序列化,所以建议每个
javaBean都实现Serializable或Externalizable,前者无需实现任何方法就可以成为可序列化对象,否则则使用在 需要自定义序列化行为的情景。 - 序列化对象的东西有
对象 Field (包括基本类型、引用类型),不会序列化的东西有方法,static Field,transient Field。因此以下修改并不需要修改序列化版本,即serialVersionUID:- 仅修改了方法,static/transient Field
- 如果出现版本一致,但是 同名Field 的数据类型不同时,则反序列化失败
- 如果已序列化的对象比新类的 Field 多,则忽略这些 Field
- 如果已序列化的对象比新类的 Field 少,则这些 Field 为其类型的初始值
- 反序列化的读入顺序要跟 序列化的写入顺序一致,因为在同一个实例只会序列化一次,再次序列化同样的实例则只会写入其序列化编号,以保证序列化的同样的对象仍然指向同一个实例。

- 反序列化并没有调用类的构造器
- 由于远程调用时需要将对象进行序列化,所以建议每个
- 字节流与字符流
- 字节流是以字节为单位读写的流(一个字节),字符流是以字符为单位(两个字节),但本质上是使用字节来保存文件的
- 字节流使用的类名称是
InputStream和OutputStream,字符流使用的类名称是Reader和Writer - 转换流:使用
InputStreamReader可以将 字节流 转为 字符流 PushbackInputStream可以unread一些已经被读的数据,推回到数据源。PushbackInputStream pushback = new PushbackInputStream(new FileInputStream("/a.txt"))
RandomAccessFile- 提供
void seek(long position)long getFilePointer()方法,可以实现非顺序访问
- 提供
Buffer- 读数据前要先进行
buffer.flip()将limit移到position的位置,避免读到null数据 - 写数据前要先进行
buffer.clear令limit = capacity以及positon = 0 allocate()以及allocateDirect(),后者的创建成本高,但是读取效率高
- 读数据前要先进行
ChannelChannel可以将文件通过MapedByteBuffer全部映射 到内存里,且只可以通过Buffer进行读写- 建议通过
XxxInputStream.getChannel的方法获取相对应的Channel实例
JAVA 7的NIO.2- 文件工具类
Files:方法有walkFileTree(Path start, FileVisitor<? super Path>)其中FileVisitor代表一个文件访问器,在遍历子目录以及文件时,触发其不同的方法,如:postVisitDirectory(T dir,IOException exce) : 遍历子目录时触发该方法以及visitFile(T File,BasicFileAttrbutes attrs) :访问file文件是触发该方法。这些方法都返回FileVisitResult枚举类,决定在方法结束后,文件访问器的行为。 Path工具类中WatchService监控文件工具。可以监听指定文件夹/文件的事件
- 文件工具类
本文介绍了Java中对象序列化的概念及其实现方式,包括实现Serializable接口和Externalizable接口的区别。此外还探讨了序列化过程中哪些成员会被序列化,以及在序列化版本不一致时如何处理。同时,文章对比了字节流与字符流的特点,并介绍了几种常用的流操作类,如RandomAccessFile和Buffer等。

被折叠的 条评论
为什么被折叠?



