《Java 核心技术面试》课程笔记(十一)
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 操作基于事件和回调机制。
- 应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。
- BIO,传统的 java.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 核心技术面试》课程笔记(十一)相关推荐
- Java核心技术卷一读书笔记
文章目录 Java核心技术卷一读书笔记 第一章 Java程序设计概述 1.1 关键特性 第二章 Java程序设计环境 2.1 使用命令行工具 第三章 Java的基本查询设计结构 3.1 数据类型 3. ...
- java常见面试考点(十一):git与svn区别
java常见面试考点 往期文章推荐: java常见面试考点(六):深入理解String类型 java常见面试考点(七):递归与迭代 java常见面试考点(八):成员变量与局部变量 ja ...
- java第一节课程笔记、课后习题
第一课:JAVA初体验 文件名不同的错误 main的单词写错编译的结果 输的的内容没加双引号编译的结果 在一行代码结束没加分号编译的结果 /n 换行 /t 水平线对齐 java程序的注释 /* *He ...
- Java核心技术卷一学习笔记1
在搞本科生毕设之余,闲下来看看书,写写博客.由于研究生学习要做一个数据可视化的项目,需要用到Java.所以拿了一本<Java核心技术卷一>正在一步步复习之前所学的Java知识. 3.9大数 ...
- 《Java 核心技术面试》课程笔记(十)
如何保证集合是线程安全的? 典型回答 Java 提供了不同层⾯的线程安全支持. 在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapp ...
- 《Java核心技术面试精讲--杨晓峰》学习笔记目录
这仅仅是我个人的理解,想要仔细了解请去 极客时间 购买阅读 笔记会写的很多,也是一个夯实基础的过程吧 笔记的内容大部分是从专栏以及留言区摘录 10 11 12 中涉及到的 IO 与 NIO 知识点我许 ...
- java核心技术面试精讲
前言 大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是"HUAWEI"面经!这是一次真实的面试经历,虽然不是我自己亲身经历但是听当事人叙述后便会深有同感(因为我朋友 ...
- 深藏功与名!献给学弟学妹的“Java核心面试知识笔记”
2021 年一个不平淡的一年,金三银四也快要过去,各路码友们都开始磨拳擦脚,背面试题.知识点.小编最近日熬夜整理了一份关于 SpringBoot,JVM 篇,多线程 &并发,Spring,My ...
- 2022最新总结【Java岗面试核心笔记】速成版
在备战面试的时候,大家总会通过刷题的方式来准备,然而刷题是有用没错,有时候还得看看押题能不能压中重点,大厂喜欢问些什么技术点,不然当那个笑眯眯的面试官问出那些你再熟悉不过的问题 Java 问题时, ...
最新文章
- SqlSessionFactoryBean的构建流程
- 16 BasicHashTable基本哈希表类(三)——Live555源码阅读(一)基本组件类
- wxpython富文本_Python实例讲解 -- wxpython 基本的控件 (文本)
- MYSQL:HAVING
- 如何配置IIS服务器使用的中间证书( 微软 KB954755)
- contract net with fipa
- hdu5446(2015长春网络赛J题)
- 北京协和医学院823计算机原理,2017年北京协和医学院放射医学研究所(天津)823计算机原理考研题库...
- java有趣的技术分享ppt_技术分享 | 关于 MySQL Online DDL 有趣的验证
- 为什么说嵌入式开发比单片机要难很多?
- Linux系统中nc工具那些不为人知的用法
- Flyweight模式
- 11. 判断是给属性前加typeof 可以同时判断属性是否存在
- SM2算法第十八篇:SM2毕设论文
- stm32压力传感器步进电机
- chrome 插件 html代码,【chrome 插件一】开发一个简单chrome浏览器插件
- Android静态库和动态库的区别
- macbook pro(m1) 安装JD-GUI
- 安卓识别身份证,自动提取身份证信息功能实现(附源码)
- jQuery小游戏之锅打灰太郎
热门文章
- 我是一只小僵尸java,我的世界:出生意味着“死亡”,假如你是一只僵尸,该如何活下去...
- 企业和个人怎么做软文投放?软文投放需要注意什么
- Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
- 后台管理系统中富文本编辑器 wangeditor 的简单使用(未封装)
- Autodesk 产品
- Flume+kafka+flink+es 构建大数据实时处理
- 微信小程序相机组件的使用
- SAP PLM ECN/DCN/自定义审批事件处理类(PLM常用类 函数)
- 部署Guns V4.0
- 【Blender】我的第一个3D模型--马克杯(附教程)