李文轩 2019-04-16
声明:这是本人学习极客时间的Java核心36讲的笔记,有侵权请联系我。
IO、NIO、NIO 2(AIO)
-
java.io
包,基于流模型视线。交互方式为同步阻塞的方式;在读取输入或写入输出流时,完成前,线程会一直阻塞,它们之间的调用是可靠性的线性顺序。- 优点:直观,简单
- 缺点:IO效率和扩展局限性
-
jave.nio
包,可构建多路用且同步非阻塞的IO程序;提供了接近系统底层的高性能数据操作方式。 -
Asynchronous IO
,异步非阻塞。异步IO操作基于事件和回调机制,应用操作直接返回,不会阻塞。
同步和异步
- 同步:可靠的有序运行机制,当进行同步操作时,后续任务时等待当前调用返回,才会进行下一步。
- 异步:其他任务不需要等待当前调用当返回,通常依靠事件和回调等机制来实现任务次序关系。
阻塞与非阻塞
-
阻塞:在阻塞操作中,当前线程会处于阻塞状态,无法进行其他任务,当条件就绪才能继续(像读取或者写入操作完成)
-
非阻塞:不管IO操作是否结束,直接返回,相应当操作将在后台继续处理。
-
同步或阻塞不一定就是低效的,按使用场景做分析
IO 的知识点
-
IO不仅是对文件的操作,还是在网络编程中的IO操作
-
输入输出流(
InputStream/OutputStream
)用于读取或写入字节,例如操作图片文件 -
Reader/Writer
用于操作字符,增加了字符编解码等功能。 -
BufferedOutputStream
等带缓冲区的实现,可以避免频繁的磁盘读写,提好IO处理效率 -
很多IO工具都实现了
Cloneable
接口,目的是进行资源的释放;需要利用try-with-resource
/try-finally
等保护机制保证IO工具明确关闭。
Java NIO
主要组成部分:
- Buffer,高效的数据容器,除了
Boolean
所有原始数据类型都有相应的 Buffer 实现。 - Channel,类似在操作系统上看到的文件描述符,是被用来支持批量式生产 IO 操作的一种抽象。
- Selector,NIO 多路复用的基础。它可以检测到注册在 Selector 上多个 Channel 中,是否有 Channel处于就绪状态。也实现了单线程对多 Channel 的高效管理。
- Chartset,提供 Unicode 字符串定义,NIO也提供了相应的编解码器等。
NIO和多路复用的目的:
- Java中的线程是重量级的,启动或者销毁一个线程是有明显开销的。
- 每个线程都有单独的线程栈等结构,需要占用的内存较多。
网友评论