Java NIO API详解

在JDK

1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API。对于大多数应用来说,这样的API使用很方

便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从JDK 1.4起,NIO

API作为一个基于缓冲区,并能提供非阻塞(non-blocking)IO操作的API被引入。本文对其进行深入的介绍。

NIO API主要集中在java.nio和它的subpackages中:

java.nio

定义了Buffer及其数据类型相关的子类。其中被java.nio.channels中的类用来进行IO操作的ByteBuffer的作用非常重要。

java.nio.channels

定义了一系列处理IO的Channel接口以及这些接口在文件系统和网络通讯上的实现。通过Selector这个类,还提供了进行非阻塞IO操作的办法。这个包可以说是NIO API的核心。

java.nio.channels.spi

定义了可用来实现channel和selector API的抽象类。

java.nio.charset

定义了处理字符编码和解码的类。

java.nio.charset.spi

定义了可用来实现charset API的抽象类。

java.nio.channels.spi和java.nio.charset.spi这两个包主要被用来对现有NIO API进行扩展,在实际的使用中,我们一般只和另外的3个包打交道。下面将对这3个包一一介绍。

Package java.nio

这个包主要定义了Buffer及其子类。Buffer定义了一个线性存放primitive type数据的容器接口。对于除boolean以外的其他primitive type,都有一个相应的Buffer子类,ByteBuffer是其中最重要的一个子类。

下面这张UML类图描述了java.nio中的类的关系:

Buffer

定义了一个可以线性存放primitive type数据的容器接口。Buffer主要包含了与类型(byte, char…)无关的功能。值得注意的是Buffer及其子类都不是线程安全的。

每个Buffer都有以下的属性:

capacity

这个Buffer最多能放多少数据。capacity一般在buffer被创建的时候指定。

limit

在Buffer上进行的读写操作都不能越过这个下标。当写数据到buffer中时,limit一般和capacity相等,当读数据时,limit代表buffer中有效数据的长度。

position

读/写操作的当前下标。当使用buffer的相对位置进行读/写操作时,读/写会从这个下标进行,并在操作完成后,buffer会更新下标的值。

mark

一个临时存放的位置下标。调用mark()会将mark设为当前的pos

java nio详解,Java NIO API详解相关推荐

  1. [Trident] Storm Trident 教程,state详解、trident api详解及实例

    英文原址:https://github.com/nathanmarz/storm/wiki/Trident-tutorial ---------------- Trident是在storm基础上,一个 ...

  2. 详解 Java NIO

    详解 Java NIO 文件的抽象化表示,字节流以及字符流的文件操作等属于传统 IO 的相关内容,我们已经在前面的文章进行了较为深刻的学习了. 但是传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上 ...

  3. Java NIO学习篇之缓冲区CharSet详解

    定义: CharSet是对java nio编码解码的解决方案,专门负责字符的编码和解码. 编码:字符数组.字符串 ===> 字节数组. 解码:字节数组 ==> 字符数组.字符串 API详解 ...

  4. Java NIO学习篇之通道FileChannel详解

    定义: FileChannel是Java NIO对应于磁盘等存储设备文件操作的通道. 常用API详解: 获取FileChannel的API /** * 打开一个与文件的连接通道,用于进行文件操作. * ...

  5. Java NIO学习篇之缓冲区ByteBuffer详解

    定义: ByteBuffer是Buffer的实现类之一,是一个通用的缓冲区,功能要比其他缓冲区子类多.支持直接内存.是一个抽象类.子类实现是HeapByteBuffer(非直接缓冲区子类),Direc ...

  6. Java中的IO、NIO、File、BIO、AIO详解

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?         Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...

  7. 详解Java NIO,IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  8. java httputil_Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型

    本文转载自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...

  9. Java 11中的新功能和API详解系列1

    Java 11中的新功能和API详解系列1 2018.9.27 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. JDK 11在语言语法方面有一个小改动,增加了相当数量的新API,以及 ...

最新文章

  1. Java 用正则表达式 提取目录
  2. Unity 引擎UGUI之自定义树形菜单(TreeView)
  3. 洛谷P4199 万径人踪灭(manacher+FFT)
  4. DP:Sumsets(POJ 2229)
  5. leetcode(167)两数之和 II - 输入有序数组
  6. c#hello world_C#| 打印消息/文本(用于打印Hello world的程序)
  7. 常用算法一(分治算法)
  8. 天津理工大学计算机调剂信息,天津理工大学2020考研调剂信息
  9. 宽字节UTF-8、多字节互转
  10. word转pdf linux java,java实现Word转Pdf(Windows、Linux通用)
  11. cpu压力测试 Android,测试CPU和GPU性能压力(StressMyPC)
  12. plc和服务器通讯协议,PLC实现HTTP协议的POST请求,与服务端JSON格式双向通讯
  13. pyltp实现句法分析并画出句法图
  14. 外文论文_屏幕外文本用于复制和粘贴
  15. 【html5期末大作业】基于HTML仿QQ音乐官网网站
  16. Mybatis-Plus 新手入门,一篇足以
  17. django批量修改table_django formset实现数据表的批量操作的示例代码
  18. 沅有芷兮:类型系统的数学之美
  19. 【如何学习CAN总线测试】——OSEK网络管理测试
  20. 技术支持售前人员岗位技能与职责

热门文章

  1. VHDL基本门电路和数值比较器的设计
  2. 基于verilog流水灯设计
  3. swing下拉框从mysql_Java Swing应用程序 JComboBox下拉框联动查询
  4. c语言枚举入门,C语言入门之枚举与位运算(1)
  5. linux mysql odbc驱动安装_mysql odb驱动_Mysql的odbc driver安装配置(Linux)
  6. java 信使服务_java – 自行车信使/ TSPPD与OptaPlanner
  7. python 获取行列号两个数组相等_python – 寻找在numpy中找到两个相等长度数组之间精确重叠的最快方法...
  8. bfs理解——hdu6386好题
  9. WUSTOJ 1282: Start(Java)
  10. bzoj1055玩具取名——区间DP