Java NIO概述

Java NIO(新的IO)是Java的替代IO API(来自Java 1.4),这意味着替代标准的 java IO和java Networking API。Java NIO提供了与标准IO API不同的IO工作方式。

Java NIO由以下核心组件组成:

  • 通道
  • 缓冲区
  • 选择器

除了ChannelBuffer 并Selector,Java NIO还有其他更多的类和组件。但是ChannelBuffer 和Selector构成了Java NIO API的核心。我认为,其他的组件,像 PipeFileLock只是结合三个核心组件一起使用的工具类。因此,本章我将重点介绍NIO概述中的这三个核心组件。

通道和缓冲区

通常,NIO中的所有IO都以一个通道开始通道有点像流。数据从通道可以读入缓冲区。数据也可以从一个缓冲区写入通道

在标准IO API中,你编码使用是字节流和字符流。在NIO中,你编码使用是通道和缓冲区。使用NIO读取数据,数据总是从通道读入缓冲区,或从缓冲区写入通道。

如图:

Java NIO:通道将数据读入缓冲区,缓冲区将数据写入通道

ChannelBuffer有几种类型。以下是通道在Java NIO 主要实现的列表:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

通过上面的实现可以看出,这些通道涵盖UDP + TCP网络IO和文件IO。

还有一些有趣的接口也伴随着这些类,但是为了方便理解,我将把它们放在Java NIO概述之外。将在相关的Java NIO教程的其他文本中进行说明。

下面是缓冲区Java NIO 中的核心实现的列表:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

这些Buffer覆盖了您可以通过IO发送的基本数据类型:byte,short,int,long,float,double和characters。Java NIO还具有一个MappedByteBuffer,是与内存映射文件配合使用的。

Java NIO:非阻塞IO

Java NIO支持执行非阻塞IO。例如,线程访问一个通道将数据读入到缓冲区。当通道将数据读入缓冲区时,线程还可以执行其他操作。一旦数据读入缓冲区,线程就可以继续处理它。线程执行将数据写入通道也是如此。

选择器

Java NIO还有一个新的概念“选择器”。选择器是一个能够监视事件的多个通道的对象(例如:打开连接,数据到达等等)。因此,单线程可以监视多个通道的数据。

一个选择器允许单个线程处理多个通道。如果您的应用程序有许多连接(通道)打开,但每个连接的流量都比较低,这是方便的。例如,在聊天服务器中。

如图:一个线程使用一个选择器来处理3个通道的:

Java NIO:A Thread uses a Selector to handle 3 Channel's

注册一个通道来使用选择器。称之为 select()方法。该方法将阻塞,直到有一个注册通道的事件准备就绪。一旦方法有返回值,线程就可以处理这些事件。通道事件是传入连接,数据接收等

原文:http://tutorials.jenkov.com/java-nio/overview.html

Java NIO学习笔记一 Java NIO概述的更多相关文章

  1. Java NIO 学习笔记(一)----概述,Channel/Buffer

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  2. Java IO学习笔记六:NIO到多路复用

    作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...

  3. [原创]java WEB学习笔记51:国际化 概述,API 之 locale类,dataFormat类,numberFormat类, MessageFormat类,ResourceBundle 类

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. Java基础学习笔记一 Java介绍

    java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...

  5. Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

    final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...

  6. Android(java)学习笔记89:泛型概述和基本使用

    package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; /* * ArrayList存储字符串并遍历 ...

  7. Android(java)学习笔记28:泛型概述和基本使用

    1. 泛型的概述和基本使用: package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; /* * Arr ...

  8. Java基础学习笔记四 Java基础语法

    数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...

  9. Java基础学习笔记六 Java基础语法之类和ArrayList

    引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...

随机推荐

  1. JS作用域相关知识(#精)

    在学习<你不知道的JS>一书中,特将作用域相关知识在此分享一下: #说到作用域,就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值,则使用LHS查询 2)如果查询目的是 ...

  2. Nmap功能与常用命令

    Nmap功能与常用命令 其基本功能有三个,一是探测一组主机是否在线:其次是扫描主机端口,嗅探所提供的网络服务:还可以推断主机所用的操作系统. Nmap可用于扫描仅有两个节点的LAN,直至500个节点以 ...

  3. JS作用域就这么几句话

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  4. 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇

    Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...

  5. 又拍云SSL证书全新上线,提供一站式HTTPS安全解决方案

    互联网快速发展,云服务早已融入每一个人的日常生活,而互联网安全与互联网的发展息息相关,这其中涉及到信息的保密性.完整性.可用性.真实性和可控性.又拍云上线了与多家国际顶级 CA 机构合作的数款OV & ...

  6. JWebFileTrans(JDownload): 一款可以从网络上下载文件的小程序(二)

    一  前言 本文是上一篇博客JWebFileTrans:一款可以从网络上下载文件的小程序(一)的续集.此篇博客主要在上一篇的基础上加入了断点续传的功能,用户在下载中途停止下载后,下次可以读取断点文件, ...

  7. 纯净CentOS7.2 yum源配置与使用yum 安装系统工具net-tools

    本节我们来讲CentOS 的yum 源配置 一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器 ...

  8. Net分布式系统之五:微服务架构

    因工作较忙,抽时间将框架遇到的问题和框架升级设计进行记录. 一.背景&问题 之前框架是一个基于SOA思想设计的分布式框架.各应用通过服务方式提供使用,服务之间通信是RPC方式调用,具体实现基于 ...

  9. 数据转换d2d.js

    d2d.js what? d2d是data2data的简写,用来转换为符合需求的data. why? 我们在开发中定义好了的接口字段,后端工程可能因某些原因修改了字段, 或者我们用的插件或组件用到的数 ...

  10. java线程(四)

    java5线程并发库 线程并发库是JDK 1.5版本级以上才有的针对线程并发编程提供的一些常用工具类,这些类被封装在java.concurrent包下. 该包下又有两个子包,分别是atomic和loc ...