当前位置: 首页 > news >正文

java中IO遇NIO的区别,你需要了解

Java中的IO(Input/Output)和NIO(New Input/Output)是处理数据输入输出操作的重要机制。下面分别详细讲解Java的IO与NIO,并列出面试中常问的问题点。

一、Java的IO

1. IO概述

Java IO是Java编程语言中用于输入输出操作的一套API,它允许Java程序读取和写入数据到文件、内存和网络等。Java IO是基于流的(Stream-based),流可以是输入流或输出流,按照操作单元的不同,可以分为字节流(如InputStream、OutputStream)和字符流(如Reader、Writer)。

2. IO的核心概念
  • :数据传输的通道,分为输入流和输出流。
  • 字节流:以字节为单位处理数据的流,适用于处理二进制数据(如图片、音频等)。
  • 字符流:以字符为单位处理数据的流,适用于处理文本数据。
  • 节点流:直接作用于数据源或目的地的流,如FileInputStream、FileOutputStream等。
  • 处理流:包装其他流,以便提供额外的数据处理功能,如缓冲、转换等,如BufferedInputStream、BufferedOutputStream等。
3. IO的阻塞特性

Java IO是阻塞的,即当一个线程调用read()或write()方法时,该线程会被阻塞,直到有数据可读或数据完全写入。这种特性在高并发场景下可能会消耗大量系统资源,因为每个连接都需要一个线程来管理。

二、Java的NIO

1. NIO概述

Java NIO(New Input/Output)是在JDK 1.4中引入的,用于弥补传统IO的不足。NIO提供了与IO不同的数据处理方式,它基于缓冲区(Buffer)和通道(Channel)进行操作,支持非阻塞IO和选择器(Selector)机制。

2. NIO的核心组件
  • 缓冲区(Buffer):NIO中数据的容器,通过缓冲区读取和写入数据。缓冲区是线性的、有限的,可以直接通过索引来访问。
  • 通道(Channel):连接数据源或目的地的通道,可以是双向的,即可以读也可以写。通道与缓冲区进行交互,数据从通道读入缓冲区,或从缓冲区写入通道。
  • 选择器(Selector):用于监听多个通道的事件(如连接打开、数据到达等),允许单个线程处理多个通道。
3. NIO的非阻塞特性

Java NIO支持非阻塞IO操作,即当一个线程从通道请求数据时,如果没有数据可用,该线程不会被阻塞,而是立即返回。这使得一个线程可以管理多个通道,提高了系统的并发处理能力。

三、面试常问点儿

  1. IO与NIO的主要区别是什么?

    • 面向流与面向缓冲区:IO面向流,NIO面向缓冲区。
    • 阻塞与非阻塞:IO是阻塞的,NIO支持非阻塞。
    • 选择器:IO不支持选择器,NIO支持选择器,允许单个线程处理多个通道。
  2. NIO中的核心组件有哪些?

    • 缓冲区(Buffer)
    • 通道(Channel)
    • 选择器(Selector)
  3. NIO是如何实现非阻塞IO的?

    • 通过缓冲区(Buffer)和通道(Channel)进行操作,当没有数据可读时,线程不会被阻塞,而是立即返回。
  4. 什么是选择器(Selector)?它有什么作用?

    • 选择器(Selector)是NIO中的一个组件,用于监听多个通道(Channel)上的事件。它允许单个线程处理多个通道,提高了系统的并发处理能力。
  5. 在Java中,如何实现文件的读写操作?

    • 可以使用IO流中的FileInputStream、FileOutputStream、FileReader、FileWriter等类来实现文件的读写操作。
  6. 在使用NIO进行网络编程时,如何管理多个连接?

    • 可以使用选择器(Selector)来管理多个连接,通过注册通道到选择器上,并监听通道上的事件来实现。
  7. 缓冲区(Buffer)在NIO中扮演什么角色?

    • 缓冲区是NIO中数据的容器,通过缓冲区读取和写入数据。它提供了灵活的数据处理能力,支持数据的读写、标记、重置等操作。

通过以上讲解,希望能够帮助您更好地理解Java的IO与NIO,并为面试做好充分准备。

相关文章:

  • 这款免费工具让你的电脑焕然一新,专业人士都在用
  • Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解
  • Python精选200Tips:181-182
  • 全新一区PID搜索算法+TCN-LSTM+注意力机制!PSA-TCN-LSTM-Attention多变量时间序列预测(Matlab)
  • 怎么绕开华为纯净模式安装软件
  • 【C++】类和对象(下)
  • 多级侧边菜单(递归)
  • 汽车3d动画渲染选择哪个?选择最佳云渲染解决方案
  • 2025年营收1亿美元咨询代理机构的游戏策略:基于AIGC的无限可扩展业务
  • 默认成员函数的练习之实现日期类
  • Linux 学习笔记(十六)—— 重定向与缓冲区
  • Growthly Quest 增长工具:助力 Web3 项目实现数据驱动的增长
  • MySQL vs PostgreSQL:2024年深度对比与选择指南
  • 后端返回内容有换行标识,前端如何识别换行
  • 14.安卓逆向-frida基础-编写hook脚本2
  • python3.6+scrapy+mysql 爬虫实战
  • $translatePartialLoader加载失败及解决方式
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 08.Android之View事件问题
  • CSS实用技巧
  • Cumulo 的 ClojureScript 模块已经成型
  • EventListener原理
  • Flex布局到底解决了什么问题
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript异步流程控制的前世今生
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • magento2项目上线注意事项
  • underscore源码剖析之整体架构
  • 编写符合Python风格的对象
  • 二维平面内的碰撞检测【一】
  • ------- 计算机网络基础
  • 解决iview多表头动态更改列元素发生的错误
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • $GOPATH/go.mod exists but should not goland
  • $NOIp2018$劝退记
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)(1.11) SiK Radio v2(一)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (Charles)如何抓取手机http的报文
  • (SpringBoot)第二章:Spring创建和使用
  • (undone) MIT6.824 Lecture1 笔记
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (待修改)PyG安装步骤
  • (每日一问)基础知识:堆与栈的区别
  • (学习总结16)C++模版2
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat文件调用java类的main方法
  • .gitignore文件使用
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET程序员迈向卓越的必由之路