IO(Input Output)用于实现对数据的输入与输出操作,Java把不同的输入/输出源(键盘、文件、网络等)抽象表述为流(Stream)。流是从起源到接收的有序数据,有了它程序就可以采用同一方式访问不同的输入/输出源。
打开大文件,应避免直接将文件中的数据全部读取到内存中,可以采用分次读取的方式。
Java的NIO主要由三个核心部分组成:Channel、Buffer、Selector。
在 NIO 中,缓冲区是一个数组,用于存储数据。缓冲区包含三个关键属性:容量(capacity)、位置(position)和限制(limit)。应用程序可以将数据写入缓冲区,然后缓冲区可以被“翻转”(flip),实现向外写入数据。
通道(Channel)可以被看作是传统 IO 的 Stream,数据从 Channel 读到 Buffer,或从 Buffer 写入到 Channel。通过通道,一个 Buffer 可以向另一个 Buffer 传输数据。例如,将一个文件的内容从磁盘读取到 Buffer 中,然后发送到网络套接字中。
选择器(Selector)是 NIO 实现非阻塞 IO 的核心机制。Selector 提供了监视多个通道的能力,并可以将这些通道的 I/O 操作事件告诉应用程序。在一个线程中使用 Selector 监视多个通道,可以提高应用程序的效率。
序列化机制可以将对象转换成字节序列,这些字节序列可以保存在磁盘上,也可以在网络中传输,并允许程序将这些字节序列再次恢复成原来的对象。其中,对象的序列化(Serialize),是指将一个Java对象写入IO流中,对象的反序列化(Deserialize),则是指从IO流中恢复该Java对象。
若对象要支持序列化机制,则它的类需要实现Serializable接口,该接口是一个标记接口,它没有提供任何方法,只是标明该类是可以序列化的。