随着互联网技术的快速发展,高并发、高性能成为了现代应用程序的追求目标。传统的Java IO(Input/Output)API在处理高并发请求时显得力不从心,无法满足大规模数据处理的需求。而Java NIO(New IO)技术的出现,为开发者提供了更高效、更灵活的IO操作方式,成为处理大规模数据和高并发场景的首选技术。
1 . 缓冲区 ( Buffer ) 数据读写类型 注意点 : 以 字节缓冲区 ( ByteBuffer ) 为例 ;
最近由于工作关系要做一些Java方面的开发,其中最重要的一块就是Java NIO(New I/O),尽管很早以前了解过一些,但并没有认真去看过它的实现原理,也没有机会在工作中使用,这次也好重新研究一下,顺便写点东西,就当是自己学习 Java NIO的笔记了。本文为NIO使用及原理分析的第一篇,将会介绍NIO中几个重要的概念。
最近由于工作关系要做一些Java方面的开发,其中最重要的一块就是Java NIO(New I/O),尽管很早以前了解过一些,但并没有认真去看过它的实现原理,也没有机会在工作中使用,这次也好重新研究一下,顺便写点东西,就当是自己学习 java NIO的笔记了。本文为NIO使用及原理分析的第一篇,将会介绍NIO中几个重要的概念。
这个系列的文章,我们开始玩一玩IO方面的知识,对于IO和NIO,我们经常会接触到,了解他们的基本内容,对于我们的工作会有特别大的帮助。这篇博文我们仅仅是介绍IO和NIO的基本概念,以及一些关键词。
很多小伙伴对Java NIO的一些概念和编程不是很理解,希望通过本文对Java NIO与传统IO的对比,可以帮助大家更好地理解和掌握Java NIO。
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。
Java NIO是从Java 1.4版本开始引入的一个新的IO ,在传统的IO模型中,使用的是同步阻塞IO,也就是blocking IO。
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代码设计。 Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。 IONIOStream orientedBuffer orientedBlocking IONon blocking IO Selectors 面向流与面向缓冲 Java NI
NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
NIO 也叫 Non-Blocking IO 是同步非阻塞的 IO 模型。线程发起 IO 请求后,立即返回。同步指的是必须等待 IO 缓冲区内的数据就绪,而非阻塞指的是,用户线程不原地等待 IO 缓冲区,可以先做一些其他操作,但是要定时轮询检查 IO 缓冲区数据是否就绪。
Channel和IO中的Stream(流)是差不多一个等级的。不过Stream是单向的,如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。 NIO中的Channel的主要实现有:
互联网行业: 在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。
Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的
本文引用了“架构师社区”公众号的《史上讲的最好的Java NIO与IO的区别与应用》一文部分内容,感谢原作者的技术分享。
七 Java NIO AsynchronousFileChannel异步文件通
IO和NIO的区别: NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,IO主要用到的是流,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
学习了Java NIO和IO API之后,就有了一个问题: 什么时候用IO,什么时候用NIO? 本文将试着阐明Java NIO和IO之间使用上的区别,以及它们是如何影响到你的代码设计的。
两者有两点最明显也是最主要的区别 IO:面向流、阻塞模式 NIO:面向缓冲、非阻塞模式
OpenOption接口的实现类通常由StandardOpenOption枚举进行代替。
很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典IO(也就是常说的阻塞式IO)的API时,很快就会发现一个问题:我什么时候应该使用经典IO,什么时候应该使用NIO?
Java NIO(New IO)是从Java 1.4版本开始引入的 一个新的IO API,可以替代标准的Java IO API。 NIO与原来的IO有同样的作用和目的,但是使用 的方式完全不同,NIO支持 面向缓冲区的、基于 通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
Java NIO中,channel用于数据的传输。类似于传统IO中的流的概念。channel的两端是buffer和一个entity,不同于IO中的流,channel是双向的,既可以写入,也可以读取。而流则是单向的,所以channel更加灵活。我们在读取数据或者写入数据的时候,都必须经过channel和buffer,也就是说,我们在读取数据的时候,先利用channel将IO设备中的数据读取到buffer,然后从buffer中读取,我们在写入数据的时候,先将数据写入到buffer,然后buffer中的数据再通过channel传到IO设备中。
NIO 是一种同步非阻塞的 I/O 模型,Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。
传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务。由于线程数量小于连接数量,所以每个线程进行IO操作时就不能阻塞,如果阻塞的话,有些连接就得不到处理,NIO提供了这种非阻塞的能力。
Java IO 和 NIO的主要区别体现在以上两个方面,以下详细说明这些区别的具体含义。
详细知识参考我有道云笔记 package com.shi.nio; import java.nio.ByteBuffer; /** * * @author shiye * 一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据 * * 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区: * ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * LongBuf
本系列笔记来自于http://tutorials.jenkov.com/java-nio/index.html 边翻译边学习。
阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候阻塞: 往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。
原文:http://www.java520.cn/java%E5%9F%BA%E7%A1%80/133.html
到目前为止,我们已经使用缓冲区进行日常工作所需要掌握的大部分内容。例子没怎么超出标准的读/写过程种类,在原来的 I/O 中可以像在 NIO 中一样容易地实现这样的标准读写过程。
NIO 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的。
Channel(实现接口java.nio.channels.Channel的类)旨在提供往返NIO缓冲区的批量数据传输。这是与比较高级的I/O库(包java.io和java.net)的类并行存在的底层数据传输机制。可以从高级的数据传输类(例如java.io.File,java.net.ServerSocket或java.net.Socket)获得Channel实现,反之亦然。 Channel类似于在类似Unix的“文件描述符”。
本文原题“《NIO 入门》,作者为“Gregory M. Travis”,他是《JDK 1.4 Tutorial》等书籍的作者。
NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。
总结一下上面那段话,io就相当于一个自来水管,水相当于数据,水通过自来水管流向其他地方相当于我们的数据传输;那么nio呢,它其实相当于坐高铁/火车,我们(数据)坐上火车(buffer)从始发站通过轨道(channel)的传送到目标的站点; 到这里是不是就大概清楚啥叫nio了,它不过就是通过jvm将数据文件读取到堆外内存(为啥叫堆外内存呢?因为读取它对jvm的堆内存没有什么影响,规避了oom的影响,它的原理是占用操作系统的内存),降低了io操作的步骤,直接操作内核态(操作系统运行状态),来提升效率,同时也是高效利用cpu的能力,比如读取/拷贝大文件等操作,其实可以使用nio
Java NIO(New I/O)是一种可伸缩且非阻塞的 I/O,与传统的 Java IO 不同。它允许同时处理多个连接,并且能够更快地处理 I/O 操作,是构建高性能、可伸缩和并发应用程序的重要组成部分。
① NIO 概念 : NIO 全称为 Non-Blocking IO , 是非阻塞 IO , 与 BIO ( Blocking IO / 阻塞 IO ) 相对应 ;
NIO(New I/O)是Java提供的一种非阻塞I/O模型,它在JDK 1.4中引入。与传统的I/O模型相比,NIO提供了更高效、更灵活的I/O操作方式。
① NIO 双向读写 : NIO 中的通道 ( Channel ) 是可以双向读写的 , 而 BIO 中的 单一流 ( 输入流 / 输出流 ) 只能读或者只能写 ;
类通过实现 Java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
java nio 的全称是 java new I/O ,即一个全新的 I/O 控制系统,它的 API 的包名为 java.nio ,是在 jdk1.4 后引入的。
Java中的NIO是java1.4版本出现的新IO接口,NIO中的N可以理解为Non-blocking,不仅仅是New。NIO主要用到的是块,所以NIO的效率要比IO高很多。
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多)。 但是,发现在整理
简介 NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。
xxxBuffer buffer = xxxBuffer.allocate(最大容量);
java 1.4版本推出了一种新型的IO API,与原来的IO具有相同的作用和目的;可代替标准java IO,只是实现的方式不一样,NIO是面向缓冲区、基于通道的IO操作;通过NIO可以提高对文件的读写操作。基于这种优势,现在使用NIO的场景越来愈多,很多主流行的框架都使用到了NIO技术,如Tomcat、Netty、Jetty等;所以学习和掌握NIO技术已经是一个java开发的必备技能了。
由上图2可知, java Charset一般用于创建编码/解码对象, 对输入输出流进行编解码.
领取专属 10元无门槛券
手把手带您无忧上云