版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
《疯狂的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()
,后者的创建成本高,但是读取效率高
- 读数据前要先进行
Channel
Channel
可以将文件通过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
监控文件工具。可以监听指定文件夹/文件的事件
- 文件工具类