龙空技术网

Java入门教程-缓冲流和对象序列化

叩丁狼stef 276

前言:

而今同学们对“java缓冲区的大小”大致比较关注,姐妹们都想要知道一些“java缓冲区的大小”的相关资讯。那么小编也在网上汇集了一些关于“java缓冲区的大小””的相关内容,希望小伙伴们能喜欢,咱们快快来了解一下吧!

1.1. 文件拷贝操作

需求:把copy_before.txt文件中的数据拷贝到copy_after.txt文件中

如何,正确处理异常:

此时关闭资源的代码,又臭又长,在后续的学习中为了方便就直接使用throws抛出IO异常了,在实际开发中需要处理。

1.2. 缓冲流

节点流的功能都比较单一,性能较低。处理流,也称之为包装流,相对于节点流更高级,这里存在一个设计模式——装饰设计模式,此时撇开不谈。

包装流如何区分?写代码的时候,发现创建流对象时,需要传递另一个流对象,类似:

new 流类A( new 流类B(..) ) ;

那么流A就属于包装流,当然B可能属于节点流也可能属于包装流。

有了包装流之后,我们只关系包装流的操作即可,比如只需要关闭包装流即可,无需在关闭节点流。

非常重要的包装流——缓冲流,根据四大基流都有各自的包装流:

BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter

缓冲流内置了一个默认大小为8192个字节或字符的缓存区,缓冲区的作用用来减少磁盘的IO操作,拿字节缓冲流举例,比如一次性读取8192个字节到内存中,或者存满8192个字节再输出到磁盘中。

操作数据量比较大的流,都建议使用上对应的缓存流。

需求:把郭德纲-报菜名.mp3文件中的数据拷贝到郭德纲-报菜名2.mp3文件中

1.3. 对象序列化

序列化:指把Java堆内存中的对象数据,通过某种方式把对象数据存储到磁盘文件中或者传递给给网络上传输。序列化在分布式系统在应用非常广泛。

反序列化:把磁盘文件中的对象的数据或者把网络节点上的对象数据恢复成Java对象的过程。

需要做序列化的类必须实现序列化接口:java.io.Serializable(这是标志接口[没有抽象方法])

可以通过IO中的对象流来做序列化和反序列化操作。

ObjectOutputStream:通过writeObject方法做序列化操作的 ObjectInputStream:通过readObject方法做反序列化操作的

如果字段使用transient 修饰则不会被序列化。

测试代码

obj.txt文件

序列化的版本问题

当类实现Serializable接口后,在编译的时候就会根据字段生成一个缺省的serialVersionUID值,并在序列化操作时,写到序列化数据文件中。

但随着项目的升级系统的class文件也会升级(增加一个字段/删除一个字段),此时再重新编译,对象的serialVersionUID值又会改变。那么在反序列化时,JVM会把对象数据数据中的serialVersionUID与本地字节码中的serialVersionUID进行比较,如果值不相同(意味着类的版本不同),那么报异常InvalidCastException,即:类版本不对应,不能进行反序列化。如果版本号相同,则可以进行反序列化。

为了避免代码版本升级而造成反序列化因版本不兼容而失败的问题,在开发中我们可以故意在类中提供一个固定的serialVersionUID值。

本系列教程为叩丁狼Java基础班内部教材,若要获得最好的学习效果,需要配合对应教学视频一起学习。需要完整教学视频,请私信作者。

标签: #java缓冲区的大小