JavaL-11: IO和NIO

李文轩 2019-04-16
声明:这是本人学习极客时间的Java核心36讲的笔记,有侵权请联系我。


IO、NIO、NIO 2(AIO)

  1. java.io包,基于流模型视线。交互方式为同步阻塞的方式;在读取输入或写入输出流时,完成前,线程会一直阻塞,它们之间的调用是可靠性的线性顺序。
    • 优点:直观,简单
    • 缺点:IO效率和扩展局限性
  2. jave.nio包,可构建多路用且同步非阻塞的IO程序;提供了接近系统底层的高性能数据操作方式。
  3. 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中的线程是重量级的,启动或者销毁一个线程是有明显开销的。
  • 每个线程都有单独的线程栈等结构,需要占用的内存较多。

你可能感兴趣的:(JavaL-11: IO和NIO)