引子:今天在面试的时候经过一位工程师的指点,在所做的服务器中使用了nio的特性,首先对于nio进行一下了解。
在 Java 编程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。流 I/O 用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换回对象。
NIO 与原来的 I/O 有同样的作用和目的,但是它使用不同的方式块 I/O。正如您将在本教程中学到的,块 I/O 的效率可以比流 I/O 高许多。
NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码。NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。
原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。
面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的 I/O 通常相当慢。
一个 面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。
在 JDK 1.4 中原来的 I/O 包和 NIO 已经很好地集成了。 java.io.* 已经以 NIO 为基础重新实现了,所以现在它可以利用 NIO 的一些特性。例如, java.io.* 包中的一些类包含以块的形式读写数据的方法,这使得即使在更面向流的系统中,处理速度也会更快。
也可以用 NIO 库实现标准 I/O 功能。例如,可以容易地使用块 I/O 一次一个字节地移动数据。但是正如您会看到的,NIO 还提供了原 I/O 包中所没有的许多好处。
通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们。
通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象。一个 Buffer 实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。
接下来,您会了解到 NIO 中通道和缓冲区是如何工作的。
Buffer 是一个对象, 它包含一些要写入或者刚读出的数据。 在 NIO 中加入 Buffer 对象,体现了新库与原 I/O 的一个重要区别。在面向流的 I/O 中,您将数据直接写入或者将数据直接读到 Stream 对象中。
在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,您都是将它放到缓冲区中。
缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
最常用的缓冲区类型是 ByteBuffer。一个 ByteBuffer 可以在其底层字节数组上进行 get/set 操作(即字节的获取和设置)。
ByteBuffer 不是 NIO 中唯一的缓冲区类型。事实上,对于每一种基本 Java 类型都有一种缓冲区类型:
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
每一个 Buffer 类都是 Buffer 接口的一个实例。 除了 ByteBuffer,每一个 Buffer 类都有完全一样的操作,只是它们所处理的数据类型不一样。因为大多数标准 I/O 操作都使用 ByteBuffer,所以它具有所有共享的缓冲区操作以及一些特有的操作。
现在您可以花一点时间运行 UseFloatBuffer.java,它包含了类型化的缓冲区的一个应用例子。
Channel是一个对象,可以通过它读取和写入数据。拿 NIO 与原来的 I/O 做个比较,通道就像是流。
正如前面提到的,所有数据都通过 Buffer 对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。
通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类), 而 通道 可以用于读、写或者同时用于读写。
因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在 UNIX 模型中,底层操作系统通道是双向的。
分享到:
相关推荐
代码经过压力测试,采用反应器模式,没有第三方框架,实现功能:可以一个线程处理多个请求,也可以加上多线程。处理数据采用的多线程。实现功能:基于HTTP协议,解析请求和拼接响应,...测试并发,可以先下载,再浏览。
Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行模式 Tomcat的运行模式有3种。 1.bio模式 默认的模式,性能非常...
随着大数据技术的发展,多线程高并发等技术已经越来越成为大数据处理中的关键技术。非阻塞式I/O(new I/O,NIO)技术作为一种分布式高并发技术被广泛应用,但对于大数据量的通信往往需要很多的时间才能完成。Google提出...
高并发复用数据库链接技术详解之数据库连接池 类加载器的高级特性(自定义类加器实现加密解密) iBATIS开源主流框架(实现半自动化hibernate) 企业实用技能之详解(眼睛横纹模式验证码防止恶意登陆) 动态页面的静态化...
净额从原生Java的Io操作(BIO)到NIO编程,约会NIO高效并发框架——Netty,需要用到Java的基础知识(多线程,网络编程,IO,设计模式尤其是代理模式),介绍了Netty的高级架构设计和核心模块组件,Google上的...
传统的Java IO是阻塞式的,即当程序进行读写操作时,如果数据没有准备好,线程会阻塞等待,这在高并发场景下会导致线程资源的浪费。而NIO则是非阻塞式的,它允许线程在等待数据准备好的同时,继续执行其他任务,从而...
它是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。 NIO是一种基于通道和缓冲区的I/O方式,它可以使用Native函数库...
java 1.4起,jdk支持了NIO(NEW IO),因NIO(os nonblocking)的非阻塞式工作方式,让应用服务器可以极大的优化线程模型,相比传统的阻塞式IO线程和链路一对一的模式,NIO只需少量的线程即可处理所有的链路,这对广大的...
无涯教程网(learnfk)整理提供:NIO是一种同步非阻塞的I/O模型,是解决高并发、I/O处理问题的有效方式。
oid:基于Actor的并发框架,使用nio4r进行异步I / O :Ruby的异步I / O框架 :为并发而构建的Ruby / Rack Web服务器 目标 公开用于状态IO选择器的高级接口 使API保持较小尺寸,以在许多不同的OS和Ruby VM上最大化...
BIO、NIO、AIO、Netty 什么是IO:Java中I/O是以流为基础进行数据的...BIO方式适用于连接数目比较小且固定的架构,这种方 式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
java8 源码引言 本文针对一些面试经常出现的问题进行总结,会不定期更新 ...高并发下的数据处理与数据库查询 算法题 工具篇 Git SVN maven 高级篇 SOA Dubbo JVM调优 数据库调优 Spring Boot Nginx
Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。 简单地说Netty封装了JDK的NIO,不用再写一大堆复杂...对Selector做了很多细小的优化,reactor线程模型能做到高效的并发处理。
单就通信框架这一层(如RPC调用)就有许多坑等着猿猿们来跳,如果再考虑系统在高并发情况下的响应时间和性能等,又会使系统设计变得复杂。好在我们无需从零开始,业界存在着许多开源的优秀的分布式系统组件(如RPC...
操作时会阻塞线程,并发处理能力低。 Socket 编程就是 BIO,一个 socket 连接一个处理线程(这个线程负责这个 Socket 连接的一系列数据传输操作)。阻塞的原因在于:操作系统允许的线程数量是有限的,多个 socket ...
这是一个基于高并发网络框架-Netty框架的demo项目,旨在展示Netty服务端与客户端的基础使用方式,并深入探讨了自定义编解码器以及心跳机制的实现。本demo紧密结合了本人发布的《初识Netty》一文中的示例,为学习者...
分布式架构 漫谈分布式架构 初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构... Netty无锁化串行设计及高并发处理机制 手写实现多协议RPC框架
资料太多无法直接上传,所以上传到了度盘,度盘不倒永不失效 面试题节选目录: Java面试题51.SpringMVC和Struts2...架构知识透析:深入了解高并发通信模型NIO 除了上面还有Java面试集棉电子书,对于初学者和面试的都适用
Netty的高并发高性能架构设计精髓包括:主从Reactor线程模型,NIO多路复用非阻塞,无锁串行化设计思想,支持高性能序列化协议,零拷贝(直接内存的使用),ByteBuf内存池设计,灵活的TCP参数配置能力,以及并发优化...
无论是构建高性能的Web、游戏服务器、推送系统、RPC框架、消息中间件还是分布式大数据处理引擎,都离不开Netty,在整个行业中,Netty广泛而成功的应用,使其成为了Java高性能网络编程的卓绝框架。 Netty的现Tech...