NIO基础】的更多相关文章

NIO是对I/O处理的进一步抽象,包含了I/O的基础概念.我是基于网上博友的博客和Ron Hitchens写的<JAVA NIO>来学习的. NIO的三大核心内容:缓冲区,通道,选择器. 一,buffer缓冲区 1,家谱 除了以上的基础类型对应的buffer之外,还有一种MappedByteBuffer,是ByteBuffer的子类, 专门用于内存映射文件的一种特例. 2,buffer 缓冲区基础 概念上,缓冲区是包在一个对象内的基本数据元素数组. 2.1,属性 容量( capacity) 缓…
原文链接http://zhhll.icu/2020/05/18/java%E5%9F%BA%E7%A1%80/IO/NIO%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/ NIO 同步非阻塞 阻塞与非阻塞的区别: 阻塞时,在调用结果返回时,当前线程会被挂起,并在得到结果之后返回 非阻塞时,如不能立即得到结果,该调用不会阻塞当前线程,调用者需要定时轮询查看处理状态 Channel(通道)和Buffer(缓冲区) 与普通IO的不同和关系 NIO以块的方式处理数据,但是IO是…
Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计.Java NIO 由三个核心组件组件: Buffer Channel Selector 缓冲区 Buffer Buffer 是一个数据对象,我们可以把它理解为固定数量的数据的容器,它包含一些要写入或者读出的数据. 在 Java NIO 中,任何时候访问 NIO 中的数据,都需要通过缓冲区(Buffer)进行操作.读取数据时,直接从缓冲区中读取,写入数据时,写入至缓冲区.NIO…
Java在JDK1.4中引入了 java.nio 类库,为Java进军后端Server和中间件开发打开了方便之门. 一般而言,这里的 nio 代表的是 New I/O,但是从实质上来说,我们可以将其理解成:NonBlocking I/O(非阻塞). java.nio 的核心的内容有:Buffer.Channel(SelectableChannel).Selector.三者紧密配合,是实现非阻塞多路复用Server端开发的关键所在.任何想要从事Java后端Server和中间件开发的Java程序员,…
通道和缓冲区 概述 通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们. 通道是对原 I/O 包中的流的模拟.到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象.一个 Buffer 实质上是一个容器对象.发送给一个通道的所有对象都必须首先放到缓冲区中:同样地,从通道中读取的任何数据都要读到缓冲区中. 在本节中,您会了解到 NIO 中通道和缓冲区是如何工作的.…
JDK1.4引入了Java NIO API(Java New IO),Java NIO得到了广泛应用.NIO允许程序进行非阻塞IO操作.java.nio.* 包括以下NIO基本结构: Buffer - 数据的容器: Chartsets - 针对字节与Unicode的容器转换器: Channels - 代表IO操作的实体连接: Selectors - 提供可选择的.可复用的非阻塞IO: Java NIO引入了两个新的概念:通道Channel和选择器Selector: Channels是服务端和客户…
NIO里对性能提升最显著的是内存映射(memory mapping),内存访问的速度往往比文件访问的速度快几个数量级. 在内存映射之前,还需要看NIO的一些其他的特性. 缓冲区分片 slice()方法根据现有的缓冲区创建一个子缓冲区.也就是说,它创建一个新的缓冲区,新缓冲区与原来的缓冲区的一部分共享数据. package nio; import java.nio.ByteBuffer; public class SliceTest { public static void main(String…
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 传统的Socket IO,服务端为每个客户端连接开启一个线程来处理,这样服务器可以支持的客户端连接数是有限的.当需要处理大量的客户端连接,而每个客户端连接的数据量又不是很大时,使用Socket NIO来实现是可行的. Socket NIO的特点是使用了Selector,使用一个线程处理多个连接的请求,向S…
1.NIO与传统IO的比较 Java的NIO(New IO)是不同于旧IO的,旧的IO是基于字节流和字符流的,是阻塞的IO.NIO是基于通道(Channel)和缓冲区(Buffer)的,是非阻塞的IO. 使用旧IO每次读取一行数据流的流程图如下,Thread必须等待,等待readline读到一行的数据并返回. 使用NIO,可以周期判断Buffer中是否有数据,没有数据时还可以去做其它的事情.基于缓存(Buffer)在一定程度上减少了读写速度不一致所带来的等待. NIO可以使用单线程管理多个通道(…
上一篇介绍了五种NIO模型,本篇将介绍Java中的NIO类库,为学习netty做好铺垫 Java NIO 由3个核心组成,分别是Channels,Buffers,Selectors.本文主要介绍着三个部分. Channel 所有的I/O都从一个Channel开始.通道与流不同,通道是双向的,流是单向的. 即可以从通道中读取数据,也可以写数据到通道里 . 读的话,是从通道读取数据到缓冲区,写的话是从缓冲区写入数据到通道. 四种通道: FileChannel.从文件中读写数据 DatagramCha…
文章目录 1. 概述 2. 基本属性 3. 创建 Buffer 3.1 关于 Direct Buffer 和 Non-Direct Buffer 的区别 4. 向 Buffer 写入数据 5. 从 Buffer 读取数据 6. rewind() v.s. flip() v.s. clear() 6.1 flip 6.2 rewind 6.3 clear 7. mark() 搭配 reset() 7.1 mark 7.2 reset 8. 其它方法 666. 彩蛋 1. 概述 一个 Buffer…
前言 前言部分是科普,读者可自行选择是否阅读这部分内容. 为什么我们需要关心 NIO?我想很多业务猿都会有这个疑问. 我在工作的前两年对这个问题也很不解,因为那个时候我认为自己已经非常熟悉 IO 操作了,读写文件什么的都非常溜了,IO 包无非就是 File.RandomAccessFile.字节流.字符流这些,感觉没什么好纠结的.最混乱的当属 InputStream/OutputStream 一大堆的类不知道谁是谁,不过了解了装饰者模式以后,也都轻松破解了. 在 Java 领域,一般性的文件操作…
1. 概述 现在使用NIO的场景越来越多,很多技术框架都使用NIO技术,比如Tomcat,Jetty,Netty等. 传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer进行操作,数据总是从Channel读取到Buffer中,或者从Buffer写入到Channel.Selector用于监听多个通道的事件.因此,单个线程可以监听多个数据通道. Java NIO由以下几个核心部分组成: Channel(通道) Buffer(缓冲区) Selector(选择器) Channel…
java.io 核心概念是流,即面向流的编程,在java中一个流只能是输入流或者输出流,不能同时具有两个概念. java.nio核心是 selector.Channel.Buffer ,是面向缓冲区(buffer)或者面向块block. 一.Buffer  Buffer本身是一个内存块,底层是数组,数据的读写都是通过Buffer类实现的.即同一个Buffer即可以写数据也可以读数据,通过intBuffer.flip()方法进行Buffer位置状态的翻转.JAVA中的8中基本类型都有各自对应的Bu…
一.NIO概述 1. BIO带来的挑战 BIO即堵塞式I/O,数据在写入或读取时都有可能堵塞,一旦有堵塞,线程将失去CPU的使用权,性能较差. 2. NIO工作机制 Java NIO由Channel.Buffer.Selector三个核心组成,NIO框架类结构图如下: 其中,Buffer主要负责存取数据,Channel用于数据传输,获取数据,然后流入Buffer:或从Buffer取数据,发送出去. Selector允许单线程处理多个Channel,如果打开了多个连接(Channel),但每个连接…
Netty简单认识: 1) Netty 是由JBOSS 提供的一个Java 开源框架. 2) Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I0 程序. 3) Netty 主要针对在TCP协议下的使用 4)Netty本质是- 个NIO框架,适用于服务器通讯相关的多种应用场景 Netty应用: https://netty.io/wiki/related-projects.html这里面是和netty有关的框架 Netty应用于网络间的通信,如阿里的dubb…
package com.hrd.netty.demo.jnio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channe…
这里区分几个概念,也是常见但是容易混淆的概念,就是标题中的同步.异步.阻塞.非阻塞. 一.同步与异步 同步与异步,关心的是消息通信的机制.也就是调用者和被调用者之间,消息是如何进行通知的.如果是调用者主动等待调用的结果,那么就是同步.如果是被调用者主动去通知调用者,就是异步.从上面的描述中,我们可以看到.同步还是异步,主要是看的消息通知的方式,一个是调用者主动等待,一个是调用者被通知. 二.阻塞与非阻塞 同样的,对于这样两个概念,我们细细思考下,并不难理解.这两个概念都是针对于调用者来说的,如果…
1.remaining();返回当前位置与limit之间得元素数. int[] intArray={1,2,3,4}; IntBuffer intBuffer=IntBuffer.wrap(intArray); intBuffer.limit(3); intBuffer.position(1); System.out.println(intBuffer.remaining()); 2.isDirect() 判断是否为直接缓冲区. ByteBuffer byteBuffer=ByteBuffer.…
NIO.2 JDK7对NIO进行了重大改进,主要包含以下两方面 新增Path接口,Paths工具类,Files工具类. 这些接口和工具类对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程. 基于异步Channel的IO 在NIO基础上改进后的IO被称为NIO.2 , 上面第一个改进包含在java.nio下新增的包java.nio.file包. 第二个改进包含在原有的java.nio.channels下,新增了多个Aysnchronous开头的channel接口和类. 本文暂时只讨论第一…
数据通信流程: 通过selector.select()阻塞方法获取到感兴趣事件的key,根据key定位到channel,通过channel的读写操作进行数据通信.channel的read或者write操作都是通过buffer进行的. 代码示例 Server: public class Server { public static void main(String[] args) throws InterruptedException { final int port = 9999; try {…
BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架. 一.BIO的理解 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的 地址发送连接请求,通过三次握手建…
因为接下来的项目要用到netty,所以就了解一下这个程序,奈何网上的教程都是稍微有点基础的,所以,就写一篇对于netty零基础的,顺便也记录一下. 先扔几个参考学习的网页: netty 官方API: http://netty.io/4.1/api/index.html netty 中文指南:https://waylau.com/netty-4-user-guide/   (来自个人) 关于NIO基础的知识:https://my.oschina.net/andylucc/blog/614295  …
想要学习Java的Socket通信,首先要学习Java的IO和NIO基础,这方面可以阅读<Java NIO 系列教程>. 下面展示自己代码熟悉Java的NIO编程的笔记. 1.缓冲区(Buffer) /* * 一.缓冲区(Buffer):在Java 中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据 *        *       根据数据类型不同(boolean除外),提供了相应类型的缓冲区 *         ByteBuffer 那么实际上最常用的,因为网络传输的字节就是By…
使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程.而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理. 简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入.读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的Set集合,进行后续的I/O操作. 由于sel…
一.基本概念描述 1.1 I/O简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过stream对象一次移动一个字节.流IO负责把对象转换为字节,然后再转换为对象. 关于Java IO相关知识请参考我的另一篇文章:Java IO 详解 1.2 什么是NIO NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块…
一.几个基本概念 1.同步.异步.阻塞.非阻塞 同步:用户触发IO操作,你发起了请求就得等着对方给你返回结果,你不能走,针对调用方的,你发起了请求你等 异步:触发触发了IO操作,即发起了请求以后可以做自己的事,等处理完以后会给你返回处理完成的标志,针对调用方的,你发起了请求你不等 阻塞:你调用我,我试图对文件进行读写的时候发现没有可读写的文件,我的程序就会进入等待状态,等可以读写了,我处理完给你返回结果,这里的等待和同步的等待有很大的区别,针对服务提供方的,你调用我我发现服务不可用我等 非阻塞:…
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introduction/ netty是基于NIO实现的异步事件驱动的网络编程框架,学完NIO以后,应该看看netty的实现,netty框架涉及的内容特别多,这里只介绍netty的基本使用和实现原理,更多扩展的内容将在以后推出. 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎…
Java NIO( New IO) 是从Java 1.4版本开始引入的 一个新的IO API,可以替代标准的Java IO API. NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的.基于通道的IO操作. NIO将以更加高效的方式进行文件的读写操作. 一.Java NIO 与 IO 的主要区别 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 阻塞IO(Blocking IO) 非阻塞IO(Non Block…
原文链接:https://mp.weixin.qq.com/s/c9tkrokcDQR375kiwCeV9w? 现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty.学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能.在前篇文章<NIO基础>中我们学习了NIO的相关理论知识,而在本篇中我们一起来学习一下Java NIO的实战知识. 一.概述 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Se…