萤火小屋

优律的知识库

  • 首页
  • 归档
  • 分类
  • 标签
  • 留言
  • 关于

  • 搜索
消息队列 RabbitMQ Redis 双指针 力扣 动态代理 Git YAML SpringBoot SpringMVC 回溯算法 分治算法 归并排序 快排 手撕 事务 MySQL索引 MySQL 小技巧 Spring Framework Spring 动态规划 Linux Android 贪心算法 操作系统 进程调度模拟 IPv6 数据库 计算机组成原理 计算机基础 栈 Java 静态路由 路由器 交换机 数字通信 网络工程 计算机网络 Web http 大学学习技巧 程序设计 算法

Java的IO流

发表于 2021-07-31 | 分类于 Java SE | 0 | 阅读次数 199

IO流简介

IO(Input Output)用于实现对数据的输入与输出操作,Java把不同的输入/输出源(键盘、文件、网络等)抽象表述为流(Stream)。流是从起源到接收的有序数据,有了它程序就可以采用同一方式访问不同的输入/输出源。

  • 按照数据流向,可以将流分为输入流和输出流,其中输入流只能读取数据、不能写入数据,而输出流只能写入数据、不能读取数据。
  • 按照数据类型,可以将流分为字节流和字符流,其中字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。
  • 按照处理功能,可以将流分为节点流和处理流,其中节点流可以直接从/向一个特定的IO设备(磁盘、网络等)读/写数据,也称为低级流,而处理流是对节点流的连接或封装,用于简化数据读/写功能或提高效率,也称为高级流。

Java提供了大量的类来支持IO操作,下表整理了其中比较常用的一些类。其中,第一行是抽象父类,其他所有的类都继承自它们。

分类字节输入流字节输出流字符输入流字符输出流
抽象父类InputStreamOutputStreamReaderWriter
文件流(节点流)FileInputStreamFileOutputStreamFileReaderFileWriter
数组流(节点流)ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
管道流(节点流)PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
字符串流(节点流)StringReaderStringWriter
缓冲流(处理流)BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流(处理流)InputStreamReaderOutputStreamWriter
对象流(处理流)ObjectInputStreamObjectOutputStream
打印流(处理流)PrintStreamPrintWriter
推回输入流(处理流)PushbackInputStreamPushbackReader
特殊流(处理流)DataInputStreamDataOutputStream

根据命名理解各个流的作用:

  • 以File开头的文件流用于访问文件
  • 以ByteArray/CharArray开头的流用于访问内存中的数组
  • 以Piped开头的管道流用于访问管道,实现进程之间的通信
  • 以String开头的流用于访问内存中的字符串
  • 以Buffered开头的缓冲流,用于在读写数据时对数据进行缓存,以减少IO次数
  • InputStreamReader、InputStreamWriter是转换流,用于将字节流转换为字符流
  • 以Object开头的流是对象流,用于实现对象的序列化
  • 以Print开头的流是打印流,用于简化打印操作
  • 以Pushback开头的流是推回输入流,用于将已读入的数据推回到缓冲区,从而实现再次读取
  • 以Data开头的流是特殊流,用于读写Java基本类型的数据

Java的序列化与反序列化

序列化与反序列化的简介

序列化机制可以将对象转换成字节序列,这些字节序列可以保存在磁盘上,也可以在网络中传输,并允许程序将这些字节序列再次恢复成原来的对象。其中,对象的序列化(Serialize),是指将一个Java对象写入IO流中,对象的反序列化(Deserialize),则是指从IO流中恢复该Java对象。

若对象要支持序列化机制,则它的类需要实现Serializable接口,该接口是一个标记接口,它没有提供任何方法,只是标明该类是可以序列化的,Java的很多类已经实现了Serializable接口,如包装类、String、Date等。

若要实现序列化,则需要使用对象流ObjectInputStream和ObjectOutputStream。其中,在序列化时需要调用ObjectOutputStream对象的writeObject()方法,以输出对象序列。在反序列化时需要调用ObjectInputStream对象的readObject()方法,将对象序列恢复为对象。

serialVersionUID变量

serialVersionUID代表序列化的版本,通过定义类的序列化版本,在反序列化时,只要对象中所存的版本和当前类的版本一致,就允许做恢复数据的操作,否则将会抛出序列化版本不一致的错误。如果不定义序列化版本,在反序列化时可能出现冲突的情况,例如:

  1. 创建该类的实例,并将这个实例序列化,保存在磁盘上;
  2. 升级这个类,例如增加、删除、修改这个类的成员变量;
  3. 反序列化该类的实例,即从磁盘上恢复修改之前保存的数据。

在第3步恢复数据的时候,当前的类已经和序列化的数据的格式产生了冲突,可能会发生各种意想不到的问题。增加了序列化版本之后,在这种情况下则可以抛出异常,以提示这种矛盾的存在,提高数据的安全性。

本文编写于2021-07-31,日后的学习和工作会继续完善IO类的具体使用

# Java
Linux查看文本命令
Java的异常类
  • 文章目录
  • 站点概览
优律

优律

优律的知识库

83 日志
20 分类
44 标签
E-mail Twitter Instagram
Links
  • CZLisyx - 浮生志
  • Vedfolnir
0%
© 2019 — 2023 萤火小屋——优律的博客网站
网站已勉强运行 
Halo博客系统技术支持