1. 介绍一下Java中的IO流(

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

2. 怎么用流打开一个大文件?(

打开大文件,应避免直接将文件中的数据全部读取到内存中,可以采用分次读取的方式。

  1. 使用缓冲流。缓冲流内部维护了一个缓冲区,通过与缓冲区的交互,减少与设备的交互次数。使用缓冲输入流时,它每次会读取一批数据将缓冲区填满,每次调用读取方法并不是直接从设备取值,而是从缓冲区取值,当缓冲区为空时,它会再一次读取数据,将缓冲区填满。使用缓冲输出流时,每次调用写入方法并不是直接写入到设备,而是写入缓冲区,当缓冲区填满时它会自动刷入设备。
  2. 使用NIO。NIO采用内存映射文件的方式来处理输入/输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入/输出比传统的输入/输出要快得多。

3. 说说NIO的实现原理(⭐⭐

Java的NIO主要由三个核心部分组成:Channel、Buffer、Selector。

  1. 缓冲区(Buffer)

在 NIO 中,缓冲区是一个数组,用于存储数据。缓冲区包含三个关键属性:容量(capacity)、位置(position)和限制(limit)。应用程序可以将数据写入缓冲区,然后缓冲区可以被“翻转”(flip),实现向外写入数据。

  1. 通道(Channel)

通道(Channel)可以被看作是传统 IO 的 Stream,数据从 Channel 读到 Buffer,或从 Buffer 写入到 Channel。通过通道,一个 Buffer 可以向另一个 Buffer 传输数据。例如,将一个文件的内容从磁盘读取到 Buffer 中,然后发送到网络套接字中。

  1. 选择器(Selector)

选择器(Selector)是 NIO 实现非阻塞 IO 的核心机制。Selector 提供了监视多个通道的能力,并可以将这些通道的 I/O 操作事件告诉应用程序。在一个线程中使用 Selector 监视多个通道,可以提高应用程序的效率。

4. 介绍一下Java的序列化与反序列化(⭐⭐

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

若对象要支持序列化机制,则它的类需要实现Serializable接口,该接口是一个标记接口,它没有提供任何方法,只是标明该类是可以序列化的。