Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java NIO 总结: NIO技术基础回顾

Java NIO 总结: NIO技术基础回顾

作者头像
公众号:码到三十五
发布于 2024-07-14 23:55:07
发布于 2024-07-14 23:55:07
44400
代码可运行
举报
文章被收录于专栏:设计模式设计模式
运行总次数:0
代码可运行

引言

随着互联网技术的快速发展,高并发、高性能成为了现代应用程序的追求目标。传统的Java IO(Input/Output)API在处理高并发请求时显得力不从心,无法满足大规模数据处理的需求。而Java NIO(New IO)技术的出现,为开发者提供了更高效、更灵活的IO操作方式,成为处理大规模数据和高并发场景的首选技术。

一、基本概念

Java NIO是Java 1.4版本引入的一套新的IO API,它提供了非阻塞IO操作的功能,支持面向缓冲区的、基于通道的IO操作。Java NIO的核心组件包括Channels、Buffers和Selectors。

在这里插入图片描述
在这里插入图片描述
Channels(通道)

通道是Java NIO中用于数据读写的对象,类似于传统IO中的流。通道支持非阻塞IO操作,并且可以同时进行读写操作。Java NIO中的通道主要有FileChannel、SocketChannel和ServerSocketChannel等。

Buffers(缓冲区)

缓冲区是Java NIO中用于存储数据的内存块,它是NIO中的数据容器。缓冲区本质上是一个数组,可以保存不同数据类型的数据。在NIO中,所有数据的读写都是通过缓冲区来进行的。

Selectors(选择器)

选择器是Java NIO中的一个重要组件,它用于监控多个通道的IO事件。当一个或多个事件发生时,选择器会通知对应的通道进行处理。使用选择器可以实现单线程处理多个通道的IO操作,提高系统的并发性能。

二、工作流程与优势

Java NIO的工作流程主要包括创建通道、创建缓冲区、注册通道、选择就绪通道和处理事件等步骤。与传统IO相比,Java NIO的优势主要体现在以下几个方面:

  1. 非阻塞IO:Java NIO支持非阻塞IO操作,允许线程在等待数据期间执行其他任务,提高了系统的并发处理能力和资源利用率。
  2. 内存管理:Java NIO中的缓冲区可以重复利用,减少了频繁的内存分配和回收,降低了内存消耗。
  3. 可扩展性:Java NIO的基于事件驱动的线程模型可以轻松地处理大量的并发连接,提高了系统的可扩展性。

其工作流程如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三、NIO与BIO的区别

Java NIO(New IO)和BIO(Blocking IO)是Java中两种不同的I/O处理方式,它们在处理数据传输时有着显著的区别。以下是它们的主要区别:

  1. 数据传输方式
  • BIO:数据从磁盘读取到内核缓冲区,然后再复制到用户空间缓冲区。这个过程是顺序的,意味着在一个操作完成之前,线程可能会被阻塞。
  • NIO:数据直接从磁盘读取到用户空间缓冲区,大大减少了内核空间到用户空间的复制过程,提高了数据传输的效率。
  1. 线程处理方式
  • BIO:是面向流的,并且是同步阻塞的。这意味着线程在等待数据完全传输过来后才能处理数据。
  • NIO:是面向块的(缓冲区),并且是同步非阻塞的。这意味着线程可以在数据传输过程中做其他事情,从而提高了系统的并发性。
  1. 数据传输速度
  • NIO:由于减少了数据从磁盘到用户空间的复制过程,所以它的数据传输速度通常比BIO快。
  1. 选择器(Selectors)
  • NIO:提供了一种机制,称为选择器(Selectors),它可以同时监听多个通道(Channels)的I/O事件,使得一个单独的线程可以管理多个通道,进一步提高了系统的并发性。而BIO没有这样的机制。
  1. 通道(Channels)
  • NIO:在NIO中,所有的输入/输出都是通过通道(Channels)进行的。通道是可以进行读、写操作的流。这使得NIO的处理更加灵活,可以方便地进行双向通信。而BIO是单向的,输入流只能用于读取数据,输出流只能用于写入数据。

总之

与BIO相比,NIO具有更高的数据传输速度、更好的并发性和更灵活的数据处理方式。因此,对于需要处理大量数据或需要高并发I/O操作的场景(如网络编程),NIO通常是一个更好的选择。但是,如果你不需要这些特性,或者你的应用场景更适用于传统的BIO模型,那么使用BIO也是可行的。重要的是根据实际需求和场景选择最合适的I/O模型。

四、基本使用

下面是一个简单的Java NIO编程使用Java NIO进行文件的读写操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class NIOFileExample {
    public static void main(String[] args) {
        try {
            // 打开文件通道
            FileChannel fileChannel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE);
            
            // 创建缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            
            // 从文件中读取数据到缓冲区
            int bytesRead = fileChannel.read(buffer);
            
            // 切换缓冲区的读写模式
            buffer.flip();
            
            // 从缓冲区读取数据并处理(这里仅打印)
            while (buffer.hasRemaining()) {
                System.out.print((char) buffer.get());
            }
            
            // 清空缓冲区,以便下次使用
            buffer.clear();
            
            // 假设向缓冲区写入一些数据
            buffer.put("Hello, NIO!".getBytes());
            
            // 切换缓冲区的读写模式
            buffer.flip();
            
            // 将缓冲区的数据写入文件
            while (buffer.hasRemaining()) {
                fileChannel.write(buffer);
            }
            
            // 强制将缓冲区的数据写入磁盘
            fileChannel.force(true);
            
            // 关闭通道
            fileChannel.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NIO模型
Java NIO是从JDK1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓存区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
石的三次方
2021/01/05
5370
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
Java BIO是一种同步阻塞的I/O模型,它是Java最早提供的I/O模型。在进行读写操作的时候,若使用BIO进行通信,则操作不再受到操作系统的控制,而是由应用程序自己控制。在BIO中,数据的读取写入必须阻塞在一个线程内等待其完成。
公众号:码到三十五
2024/03/19
1880
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
Java IO 与 NIO:高效的输入输出操作探究
输入输出(IO)是任何编程语言中的核心概念,而在Java中,IO操作更是应用程序成功运行的基石。随着计算机系统变得越来越复杂,对IO的要求也日益增加。在本文中,我们将探讨Java IO和非阻塞IO(NIO)的重要性以及如何在Java中实现高效的输入输出操作。
程序那些事
2023/10/17
2590
NIO~~
NIO 有三大核心部分:Channel( 通道) ,Buffer( 缓冲区), Selector( 选择器)
大忽悠爱学习
2022/05/06
9180
NIO~~
Java知识点——NIO和BIO
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jvUiQgVM-1584882587306)(img/NIO图例.png)]
用户7073689
2020/03/24
3890
NIO前言:一、NIO与IO的区别二、通道和缓冲区三、NIO的网络通信总结:
所谓NIO,就是New IO的缩写。是从JDK 1.4开始引入的全新的IO API。NIO将以更高效的方式进行文件的读写操作,可完全代替传统的IO API使用。而且JDK 1.7对NIO又进行了更新,可以称作NIO 2.0。
贪挽懒月
2018/12/27
6.7K0
Java IO 和 NIO
在 Java 编程中,输入输出(IO)是不可或缺的部分,随着技术的发展,Java 的 IO 系统也经历了显著的变化。本文将深入探讨 Java IO 和 NIO 的历史、优缺点以及适用场景。
井九
2024/10/12
1440
Java IO 和 NIO
Java IO与NIO
七 Java NIO AsynchronousFileChannel异步文件通
后端码匠
2019/10/09
7160
Java IO与NIO
Java NIO 开发
我在早期有讲过Java NIO的基本用法 如果初学者可以 浏览 早期的Java NIO 文章
闻说社
2024/09/26
1170
Java NIO 开发
总结了才知道,原来Java NIO的channel是这么用的!
Channel(实现接口java.nio.channels.Channel的类)旨在提供往返NIO缓冲区的批量数据传输。这是与比较高级的I/O库(包java.io和java.net)的类并行存在的底层数据传输机制。可以从高级的数据传输类(例如java.io.File,java.net.ServerSocket或java.net.Socket)获得Channel实现,反之亦然。 Channel类似于在类似Unix的“文件描述符”。
JavaEdge
2021/10/18
8120
03-Java NIO 编程 入门
缓冲区(Buffer) : 缓冲区本质上是一个可以读写数据的内存块, 可以理解成是一个容器对象(含数组), 该对象提供了一组方法,可以更轻松的使用内存块,缓冲区内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,Channel提供了从文件,网络读取数据的渠道,但是读取或写入的数据必须经由Buffer, 如图: [后面举例说明]
彼岸舞
2022/02/18
3940
03-Java NIO 编程 入门
java的NIO编程
Java NIO(New I/O)是一种可伸缩且非阻塞的 I/O,与传统的 Java IO 不同。它允许同时处理多个连接,并且能够更快地处理 I/O 操作,是构建高性能、可伸缩和并发应用程序的重要组成部分。
堕落飞鸟
2023/04/02
4590
NIO
详细知识参考我有道云笔记 package com.shi.nio; import java.nio.ByteBuffer; /** * * @author shiye * 一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据 * * 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区: * ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * LongBuf
用户5927264
2019/10/15
7520
java nio 详_java NIO 详解
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。本系列教程将有助于你学习和理解Java NIO。
全栈程序员站长
2022/09/08
7580
java nio 详_java NIO 详解
java nio
文章目录 1. 缓冲区(Buffer) 1.1. 常用的方法 1.2. 核心属性 1.3. 直接缓冲区 1.4. 非直接缓冲区 2. 通道(Channel) 2.1. 获取通道 2.2. 实例 2.3. 通道之间指定进行数据传输 2.4. 分散读取 2.5. 聚集写入 2.6. NIO阻塞式 3. Selector(选择器) 3.1. SelectionKey 3.2. NIO非阻塞式 4. 参考文章 缓冲区(Buffer) 负责数据的存取,实际上就是一个数组,用于存储不同的数据 除了布尔类型之后,其他
爱撒谎的男孩
2019/12/31
1.1K0
NIO学习(二)Channel通道与Selectors选择器
引用上一篇文章的区别。IO是传统的面向流的阻塞IO,而NIO是面向缓冲区的非阻塞式IO。在NIO中使用了一个线程来作为Selectors-选择器,来管理多个输入通道,即在使用时只需要将通道注册到选择器中,即可处理输入的通道和选择已经准备好的通道进行管理。
虞大大
2020/08/26
6360
NIO学习(二)Channel通道与Selectors选择器
JDK10都发布了,nio你了解多少?
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多)。 但是,发现在整理
Java3y
2018/06/11
6250
你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)
在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层的高性能数据操作方式
宁在春
2022/10/31
3310
你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)
Java NIO 系列(转)
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。
用户6182664
2019/09/05
6060
JavaIO流:NIO梳理
NIO 也叫 Non-Blocking IO 是同步非阻塞的 IO 模型。线程发起 IO 请求后,立即返回。同步指的是必须等待 IO 缓冲区内的数据就绪,而非阻塞指的是,用户线程不原地等待 IO 缓冲区,可以先做一些其他操作,但是要定时轮询检查 IO 缓冲区数据是否就绪。
栗筝i
2022/12/02
3280
JavaIO流:NIO梳理
相关推荐
NIO模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验