【面经总结】Java基础 - IO

10 阅读2分钟

序列化

什么是序列化和反序列化?

序列化:将对象转换为二进制数据

反序列化:将二进制数据转换为对象

  • 目的:方便网络传输、持久化保存

Java 是怎么实现序列化的?

Java 通过对象输入输出流来实现序列化和反序列化,对象序列化不会关注类中的静态变量。

Java 的序列化过程:

  1. 对象及其属性都要必须属于 EnumArraySerializable
  2. 类中需要存在 serialVersionUID 字段,用来标明版本。
  3. 使用 ObjectOutputStream 进行序列化。
/**
 * 序列化
 */
private static void serialize(String filename) throws IOException {
    File f = new File(filename);
    // 文件输出流
    OutputStream out = new FileOutputStream(f); 
    // 对象输出流
    ObjectOutputStream oos = new ObjectOutputStream(out); 
    // 保存对象
    oos.writeObject(new Person("Jack", 30, Sex.MALE)); 
    oos.close();
    out.close();
}
​
/**
 * 反序列化
 */
private static void deserialize(String filename) throws IOException, ClassNotFoundException {
    File f = new File(filename);
    // 文件输入流
    InputStream in = new FileInputStream(f); 
    // 对象输入流
    ObjectInputStream ois = new ObjectInputStream(in); 
     // 读取对象
    Object obj = ois.readObject();
    ois.close();
    in.close();
    System.out.println(obj);
}

img

可以使用 transient 关键字忽略掉某些字段

transient private Integer age = null;

常见的序列化协议有哪些?

  1. 二进制序列化

    1. Java 原生序列化:不能跨语言,性能较差,要求多
    2. Protobuf:Google 数据标准
    3. Thrift:Apache 开源项目
    4. Hessian
    5. Kryo
    6. FST
  2. Json 序列化

    1. Fastjson:阿里
    2. Jackson
    3. Gson:Google

网络 I/O

www.bilibili.com/video/BV1Lg…

BIO/NIO/AIO 有什么区别?

  1. BIO(同步阻塞 IO):在读、写动作完成之前,线程会一直阻塞在那里,线性调用。

    1. BIO 会阻塞线程,一个连接一个线程。已经建立 Socket 连接后不能再与其他客户端连接。
    2. BIO 可以使用多线程和线程池优化

img

  1. NIO(同步非阻塞 IO):使用后台线程执行IO,前台线程轮询查看状态。

    1. NIO 性能消耗大,需要频繁轮询。
    2. 可以通过 I/O 多路复用优化

img

  1. AIO(异步非阻塞 IO):基于事件和回调机制,后台处理完成后,会通知相应线程进行后续工作。

img

I/O 多路复用是什么?

操作系统提供了一系列系统调用(select、poll、epoll),可以同时监控多个 fd 文件描述符(批量轮询)。

select 和 epoll 有什么区别?

select 的问题:

  1. 最大连接数有限
  2. 返回后通过遍历所有的 fd,找出就绪的 fd 进行下一步操作

epoll 的优势:

  1. 最大连接数无限
  2. 通过事件回调返回就绪的 fd