对于 Java 的序列化,我之前一直停留在最浅层次的认知上——把那个要序列化的类实现 Serializbale
接口就可以了嘛。
我似乎不愿意做更深入的研究,因为会用就行了嘛。
但随着时间的推移,见到 Serializbale
的次数越来越多,我便对它产生了浓厚的兴趣。是时候花点时间研究研究了。
对于 Java 的序列化,我之前一直停留在最浅层次的认知上——把那个要序列化的类实现 Serializbale
接口就可以了嘛。
我似乎不愿意做更深入的研究,因为会用就行了嘛。
但随着时间的推移,见到 Serializbale
的次数越来越多,我便对它产生了浓厚的兴趣。是时候花点时间研究研究了。
Java 的缓冲流是对字节流和字符流的一种封装,通过在内存中开辟缓冲区来提高 I/O 操作的效率。Java 通过 BufferedInputStream 和 BufferedOutputStream 来实现字节流的缓冲,通过 BufferedReader 和 BufferedWriter 来实现字符流的缓冲。
缓冲流的工作原理是将数据先写入缓冲区中,当缓冲区满时再一次性写入文件或输出流,或者当缓冲区为空时一次性从文件或输入流中读取一定量的数据。这样可以减少系统的 I/O 操作次数,提高系统的 I/O 效率,从而提高程序的运行效率。
转换流可以将一个字节流包装成字符流,或者将一个字符流包装成字节流。这种转换通常用于处理文本数据,如读取文本文件或将数据从网络传输到应用程序。
转换流主要有两种类型:InputStreamReader 和 OutputStreamWriter。
在 IO 操作中,文件的操作相对来说是比较复杂的,但也是使用频率最高的部分,我们几乎所有的项目中几乎都躺着一个叫做 FileUtil 或者 FileUtils 的工具类。
java.io.File
类是专门对文件进行操作的类,注意只能对文件本身进行操作,不能对文件内容进行操作,想要操作内容,必须借助输入输出流。
File
类是文件和目录的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
怎么理解上面两句话?其实很简单!
第一句是说 File 跟流无关,File 类不能对文件进行读和写,也就是输入和输出!
在我的职业生涯中, System.out.println()
的使用频率恐怕不亚于 main 方法的使用频率。其中 System.out
返回的正是打印流 PrintStream
。
除此之外,还有它还有一个孪生兄弟,PrintWriter。PrintStream 是 OutputStream 的子类,PrintWriter 是 Writer 的子类,也就是说,一个字节流,一个是字符流。
字符流 Reader 和 Writer 的故事要从它们的类关系图开始,来看图。
字符流是一种用于读取和写入字符数据的输入输出流。与字节流不同,字符流以字符为单位读取和写入数据,而不是以字节为单位。常用来处理文本信息。
如果用字节流直接读取中文,可能会遇到乱码问题,见下例:
Java 的序列流(ObjectInputStream 和 ObjectOutputStream)是一种可以将 Java 对象序列化和反序列化的流。
序列化是指将一个对象转换为一个字节序列(包含对象的数据
、对象的类型
和对象中存储的属性
等信息),以便在网络上传输或保存到文件中,或者在程序之间传递。在 Java 中,序列化通过实现 java.io.Serializable 接口来实现,只有实现了 Serializable 接口的对象才能被序列化。
“老王,Java IO 也太上头了吧?”新兵蛋子小二向头顶很凉快的老王抱怨道,“你瞧,我就按照传输方式对 IO 进行了一个简单的分类,就能搞出来这么多的玩意!”
好久没搞过 IO 了,老王看到这幅思维导图也是吃了一惊。想想也是,他当初学习 Java IO 的时候头也大,乌央乌央的一片,全是类,估计是所有 Java 包里面类最多的,一会是 Input 一会是 Output,一会是 Reader 一会是 Writer,真不知道 Java 的设计者是怎么想的。
我们必须得明确一点,一切文件(文本、视频、图片)的数据都是以二进制的形式存储的,传输时也是。所以,字节流可以传输任意类型的文件数据。
java.io.OutputStream
是字节输出流的超类(父类),我们来看一下它定义的一些共性方法:
1、 close()
:关闭此输出流并释放与此流相关联的系统资源。
2、 flush()
:刷新此输出流并强制缓冲区的字节被写入到目的地。
害,小二最熟的是 Java,但很多 Java 基础知识都不知道,比如 transient 关键字以前就没用到过,所以不知道它的作用是什么,今天去招银面试的时候,面试官问到了这个:说说 Java 的 transient 关键字吧,结果小二直接懵逼了。
下面是他自己面试凉了以后回去做的总结,分享出来,大家一起涨下姿势~~~好了,废话不多说,下面开始:
我们知道,一个对象只要实现了 Serilizable 接口,它就可以被序列化。