一.简介 java NIO相关类在jdk1.4被引入,用于提高I/O的效率.java NIO包含很多东西,但核心的东西不外乎Buffer.channel和selector.本文先来看Buffer的实现. 二.继承体系 Buffer 的继承类比较多,用于存储各种类型的数据.包括 ByteBuffer.CharBuffer.IntBuffer.FloatBuffer 等等.这其中,ByteBuffer 最为常用.所以接下来将会主要分析 ByteBuffer 的实现.Buffer 的继承体系图如下:…
1.概述:NIO我的理解就是 New IO,是API1.4里提供的新的API,为所有的原始类型做缓存支持. NIO主要的核心组成部分: Buffer(缓存) Channels(通道) Selectors(选择器) 2.缓存区 描述:一个用于特定基本类型数据的容器.缓冲区是特定基本类型(除了布尔型)元素的线性有限序列.除了内容之外,缓存区还具有容量.位置和界限. 容量:是缓存区所包含的元素的数量.缓冲区的容量不能为负并且不可更改. 位置:是下一个要读取或写入的元素的索引.缓冲区的位置不能为负,并且…
一.简介 通道是 Java NIO 的核心内容之一,在使用上,通道需和缓存类(ByteBuffer)配合完成读写等操作.与传统的流式 IO 中数据单向流动不同,通道中的数据可以双向流动.通道既可以读,也可以写. Java NIO 出现在 JDK 1.4 中,由于 NIO 效率高于传统的 IO,所以 Sun 公司从底层对传统 IO 的实现进行了修改.修改的方式就是在保证兼容性的情况下,使用 NIO 重构 IO 的方法实现,无形中提高了传统 IO 的效率. 所有的 NIO 操作始于通道,通道是数据来…
一.简介 前面的文章说了缓冲区,说了通道,本文就来说说 NIO 中另一个重要的实现,即选择器 Selector.在更早的文章中,我简述了几种 IO 模型.如果大家看过之前的文章,并动手写过代码的话.再看 Java 的选择器大概就会知道它是什么了,以及怎么用了.选择器是 Java 多路复用模型的一个实现,可以同时监控多个非阻塞套接字通道.示意图大致如下: 如果大家了解过多路复用模型,那应该也会知道几种复用模型的实现.比如 select,poll 以及 Linux 下的 epoll 和 BSD 下的…
一.简介 前面一篇文章讲了文件通道,本文继续来说说另一种类型的通道 – 套接字通道.在展开说明之前,咱们先来聊聊套接字的由来.套接字即 socket,最早由伯克利大学的研究人员开发,所以经常被称为Berkeley sockets.UNIX 4.2BSD 内核版本中加入了 socket 的实现,此后,很多操作系统都提供了自己的 socket 接口实现.通过 socket 接口,我们就可以与不同地址的计算机实现通信. 如果大家使用过 Unix/Linux 系统下的 socket 接口,那么对 soc…
前言: 传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 CPU 使用效率大大降低. 所以,jdk 1.4 发布了 NIO 包,NIO 的文件读写设计颠覆了传统 IO 的设计,采用通道+缓存区使得新式的 IO 操作直接面向缓存区,并且是非阻塞的,对于效率的提升真不是一点两点,我们一起来看看. 通道 Channel 我们说过,NIO 的核心就是通道和缓存区,所以它们的工作模式是这样的: 通道有点类似 IO 中的流,但不同的是,同一个通道既允许读也允许写,而任意一个流要么…
缓存区 Buffer 是数据容器 ByteBuffer 可以存储除了 boolean 以外的其他 7 种Java基本数据类型,如 getInt.putInt Buffer 是抽象类,它有除了 Boolean 以外的其他 7 种Java基本数据类型子类,如IntBuffer 缓存区的初始化 ⑴ 静态方法 allocate:初始化一个指定容量的缓存区 解释一下图例: 1.数组下标:数字(1,2,3,4,5)表示数组下标 1.数组:灰色长方形内表示真实有效的数组. 2.数组元素:数字所在的白色黑边正方…
在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端”来讲,服务器端需要阻塞式接收客户端的请求,这里的阻塞式表示服务器端的应用代码会被挂起直到客户端有请求过来,在高并发的应用场景有多个客户端发起连接下非阻塞式IO(NIO)是不二之选(且只需要在服务器端使用1个线程来管理,并不需要多个线程来处理多个连接).在现实情况下,Tomcat.Jetty等很多Web服务器…
在软件系统中,由于IO的速度要比内存慢,因此,I/O读写在很多场合都会成为系统的瓶颈.提升I/O速度,对提升系统整体性能有着很大的好处. 在Java的标准I/O中,提供了基于流的I/O实现,即InputStream和OutputStream.这种基于流的实现以字节为单位处理数据,并且非常容易建立各种过滤器. NIO是New I/O的简称,具有以下特性: 为所有的原始类型提供(Buffer)缓存支持: 使用 java.nio.charset.Charset 作为字符集编码解码解决方案: 增加通道(…
创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1.调用allocate方法 2.调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义: allocate方法创建缓冲区 调用allocate方法实际上会返回new HeapCharBuffer(capacity, capacity)对象: 缓存空间存储在CharBuffer类的成员属性char[] hb数组里,即JVM堆里: 如下示例,创建了一个容量大小为10的CharBuffer: CharBuffer bf = CharB…