Java IO 编码解码

ASCII 数字 0-9 对应的 byte 值为 48-57
Unicode 与 Java
char 是字符数据类型,是无符号的,占2字节,大小范围是 0-65535,是 16 位二进制的 Unicode 字符,Java 用 char 来表示一个字符
大部分中文使用三个字节的 UTF-8 方法编码

IO 传输的两个关键问题:

  1. Encode/Decode
  2. Big Endian/Little Endian

二进制方式读取文件

  • ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组
  • ByteArrayInputStream: 可以将字节数组转化为输入流
  • 字符串的编码/解码问题
    charset
  • 多字节数据(short/int/long/double/float)的编码/解码问题
    ObjectOutputStream (默认 Big-Endian 顺序)
  • Object 对象编码/解码问题
    Java Serialize 机制(二进制)以及 java.beans 包里面的 XMLEncoder (文本编码)

Java Object 序列化机制

  • 当父类实现了序列化,子类也自动实现了序列化,不需要显式实现 Serializable 接口
  • 反过来一个子类实现了 Serializable 接口,希望父类对象序列化,需要父类也实现Serializable 接口,否则父类对象的成员变量不参与序列化
  • 当一个对象的实例变量引用其他对象,序列化该对象时,也会把引用对象也进行序列化
  • 某些对象不能序列化,如:安全问题不能远程传输的对象、无法重新还原的对象(socket、thread、Stream)

RandomAccessFile==>MappedByteBuffer
MappedByteBuffer:内存映射文件 MapMode 映射模式:

  • READ_ONLY 只读映射模式
  • READ_WRITE 读写映射模式
  • PRIVATE 通过 put 方法对 MappedByteBuffer 的修改不会修改到磁盘文件,只修改虚拟内存的修改

MappedByteBuffer 在父类 ByteBuffer 的基础上新增了几个方法

  1. fore 缓冲区在 READ_WRITE 模式下,此方法对缓冲区所做的内容更改强制写入文件
  2. load 将缓冲区的内容载入物理内存,并返回该缓冲区的引用
  3. isLoaded 判断缓冲区的内容是否在物理内存,如果在就返回 true,否则返回 false

Java IO 中应用到了装饰者模式