在JAVA中,把一些不同类型的输入、输出源抽象为流,其中输入或输出的数据称为数据流,用统一的接口来表示。
数据流是一组有顺序的、有起点和终点的字节集合。
按照流的流向分、可以分为输入流和输出流。
注意,这里的输入、输出是相对于程序来说的。
输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出:把程序(内存)中的内容输出到磁盘,光盘等。
按处理数据单位不同分为字节流和字符流。
字节流:每次读取(写出)一个字节,当传输的资源文件有中文时,就会出现乱码。
字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文。
IO流的整体架构图,如下图所示。
字节流和字符流有什么区别呢?
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
知道IO流有这么多的分类 ,那我们在使用的时候应该怎么选择呢?以下有三步。
1、首先自己要知道是选择输入流还是输出流。这要根据情况而定,如果想从程序写东西到别的地方,那么 就选择输入流,反之选择输出流。
2、然后考虑你传输数据时,是每次传一个字节还是两个,每次传输一个字节就选字节流,如果还存在中文,那肯定选字符流了。
3、通过前面两步就可以选出一个合适的节点流了,比如 InputStream,如果要在此基础上增强功能,那么 就在处理流中选择一个合适的即可。
那么 字节流和字符流的使用场景是?
字节流一般用来处理图像,视频,以及PPT等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等。字节流可以用来处理纯文本文件但是,字符流不能用于处理图像视频等非文本类型的文件。
序列化和反序列化是什么?
序列:
把JAVA对象转换为字节序列的过程称为对象的序列化,也就是将对象写入IO流中。
要实现序列化,只需两步即可。
1、创建一个ObjectOutputStream输出流
2、调用ObjectOutputStream对象的writeObject方法输出可序列化对象。
反序列化:
就是从IO流中恢复对象。
也只需要两步即可。
1、创建ObjectInputStream输入流。
2、调用ObjectInputStream的readObject()得到序列化的对象