Java 提供了哪些 IO 方式?

典型回答

  • Java IO 基于不同的 IO 抽象模型和交互方式,可以分为:

    • BIO,传统的 java.io 包,它基于流模型实现。

      • 提供了我们最熟知的⼀些 IO 功能,比如 File 抽象、输入输出流等。
      • 交互方式是同步阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会⼀直阻塞在那里,它们之间的调用是可靠的线性顺序。
      • java.net 提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。
    • NIO,java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象。
      • 可以构建多路复用的、同步非阻塞 IO 程序
      • 同时提供了更接近操作系统底层的高性能数据操作方式。
    • AIO(Asynchronous IO),也就是 NIO 2,引入了异步非阻塞 IO 方式。
      • 异步 IO 操作基于事件和回调机制。
      • 应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

考点分析

  • 在实际面试中,从传统 IO 到 NIO、NIO 2,其中有很多地方可以扩展开来,考察点涉及方方面面:

    • 基础 API 功能与设计,InputStream/OutputStream 和 Reader/Writer 的关系和区别。
    • NIO、NIO 2 的基本组成。
    • 给定场景,分别用不同模型实现,分析 BIO、NIO 等模式的设计和实现原理。
    • NIO 提供的高性能数据操作方式是基于什么原理,如何使用?
    • 从开发者的角度来看,你觉得 NIO 自身实现存在哪些问题?有什么改进的想法吗?

知识扩展

  • 区分同步或异步(synchronous/asynchronous)。

    • 简单来说,同步是⼀种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下⼀步;
    • 异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系。
  • 区分阻塞与非阻塞(blocking/non-blocking)。
    • 在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如 ServerSocket 新连接建立完毕,或数据读取、写入操作完成;
    • 非阻塞则是不管 IO 操作是否结束,直接返回,相应操作在后台继续处理。
  • 不能⼀概而论认为同步或阻塞就是低效,具体还要看应用和系统特征。
    • IO 不仅仅是对文件的操作,网络编程中,比如 Socket 通信,都是典型的 IO 操作目标。
    • 输入流、输出流(InputStream/OutputStream)是用于读取或写入字节的,例如操作图片文件。
    • Reader/Writer 则是用于操作字符,增加了字符编解码等功能,适用于类似从文件中读取或者写入文本信息,本质上计算机操作的都是字节。
    • BufferedOutputStream 等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高 IO 处理效率。这种设计利用了缓冲区,将批量数据进行⼀次操作,但在使用中千万别忘了 flush。
  • Java NIO 多路复用机制
    • Buffer,高效的数据容器,除了布尔类型,所有原始数据类型都有相应的 Buffer 实现。
    • Channel,类似在 Linux 之类操作系统上看到的文件描述符,是 NIO 中被用来支持批量式 IO 操作的⼀种抽象。
    • Selector,是 NIO 实现多路复用的基础,它同样是基于底层操作系统机制,可以检测到注册在 Selector 上的多个 Channel 中,是否有 Channel 处于就绪状态,进而实现了单线程对多 Channel 的高效管理。
    • NIO 利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。

《Java 核心技术面试》课程笔记(十一)相关推荐

  1. Java核心技术卷一读书笔记

    文章目录 Java核心技术卷一读书笔记 第一章 Java程序设计概述 1.1 关键特性 第二章 Java程序设计环境 2.1 使用命令行工具 第三章 Java的基本查询设计结构 3.1 数据类型 3. ...

  2. java常见面试考点(十一):git与svn区别

    java常见面试考点 往期文章推荐:   java常见面试考点(六):深入理解String类型   java常见面试考点(七):递归与迭代   java常见面试考点(八):成员变量与局部变量   ja ...

  3. java第一节课程笔记、课后习题

    第一课:JAVA初体验 文件名不同的错误 main的单词写错编译的结果 输的的内容没加双引号编译的结果 在一行代码结束没加分号编译的结果 /n 换行 /t 水平线对齐 java程序的注释 /* *He ...

  4. Java核心技术卷一学习笔记1

    在搞本科生毕设之余,闲下来看看书,写写博客.由于研究生学习要做一个数据可视化的项目,需要用到Java.所以拿了一本<Java核心技术卷一>正在一步步复习之前所学的Java知识. 3.9大数 ...

  5. 《Java 核心技术面试》课程笔记(十)

    如何保证集合是线程安全的? 典型回答 Java 提供了不同层⾯的线程安全支持. 在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapp ...

  6. 《Java核心技术面试精讲--杨晓峰》学习笔记目录

    这仅仅是我个人的理解,想要仔细了解请去 极客时间 购买阅读 笔记会写的很多,也是一个夯实基础的过程吧 笔记的内容大部分是从专栏以及留言区摘录 10 11 12 中涉及到的 IO 与 NIO 知识点我许 ...

  7. java核心技术面试精讲

    前言 大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是"HUAWEI"面经!这是一次真实的面试经历,虽然不是我自己亲身经历但是听当事人叙述后便会深有同感(因为我朋友 ...

  8. 深藏功与名!献给学弟学妹的“Java核心面试知识笔记”

    2021 年一个不平淡的一年,金三银四也快要过去,各路码友们都开始磨拳擦脚,背面试题.知识点.小编最近日熬夜整理了一份关于 SpringBoot,JVM 篇,多线程 &并发,Spring,My ...

  9. 2022最新总结【Java岗面试核心笔记】速成版

    ​ 在备战面试的时候,大家总会通过刷题的方式来准备,然而刷题是有用没错,有时候还得看看押题能不能压中重点,大厂喜欢问些什么技术点,不然当那个笑眯眯的面试官问出那些你再熟悉不过的问题 Java 问题时, ...

最新文章

  1. SqlSessionFactoryBean的构建流程
  2. 16 BasicHashTable基本哈希表类(三)——Live555源码阅读(一)基本组件类
  3. wxpython富文本_Python实例讲解 -- wxpython 基本的控件 (文本)
  4. MYSQL:HAVING
  5. 如何配置IIS服务器使用的中间证书( 微软 KB954755)
  6. contract net with fipa
  7. hdu5446(2015长春网络赛J题)
  8. 北京协和医学院823计算机原理,2017年北京协和医学院放射医学研究所(天津)823计算机原理考研题库...
  9. java有趣的技术分享ppt_技术分享 | 关于 MySQL Online DDL 有趣的验证
  10. 为什么说嵌入式开发比单片机要难很多?
  11. Linux系统中nc工具那些不为人知的用法
  12. Flyweight模式
  13. 11. 判断是给属性前加typeof 可以同时判断属性是否存在
  14. SM2算法第十八篇:SM2毕设论文
  15. stm32压力传感器步进电机
  16. chrome 插件 html代码,【chrome 插件一】开发一个简单chrome浏览器插件
  17. Android静态库和动态库的区别
  18. macbook pro(m1) 安装JD-GUI
  19. 安卓识别身份证,自动提取身份证信息功能实现(附源码)
  20. jQuery小游戏之锅打灰太郎

热门文章

  1. 我是一只小僵尸java,我的世界:出生意味着“死亡”,假如你是一只僵尸,该如何活下去...
  2. 企业和个人怎么做软文投放?软文投放需要注意什么
  3. Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
  4. 后台管理系统中富文本编辑器 wangeditor 的简单使用(未封装)
  5. Autodesk 产品
  6. Flume+kafka+flink+es 构建大数据实时处理
  7. 微信小程序相机组件的使用
  8. SAP PLM ECN/DCN/自定义审批事件处理类(PLM常用类 函数)
  9. 部署Guns V4.0
  10. 【Blender】我的第一个3D模型--马克杯(附教程)