java)_Java NIO系列教程(一) Java NIO 概述

原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一

Java NIO 由以下几个核心部分组成:

Channels

Buffers

Selectors

虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。

Channel 和 Buffer

基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。这里有个图示:

f0226376da90fc760b9e5e4327d6667e.png

Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:

FileChannel

DatagramChannel

SocketChannel

ServerSocketChannel

正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。

与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。本教程其它章节与它们相关的地方我会进行解释。

以下是Java NIO里关键的Buffer实现:

ByteBuffer

CharBuffer

DoubleBuffer

FloatBuffer

IntBuffer

LongBuffer

ShortBuffer

这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。

Java NIO 还有个 MappedByteBuffer,用于表示内存映射文件, 我也不打算在概述中说明。

Selector

Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。

这是在一个单线程中使用一个Selector处理3个Channel的图示:

9fa355508f5b795441c8d026eb584eeb.png

要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。

d0c1501a6d8bb921cf36400dc89de69f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地读取服务器Xml文件及本地读本地的xml

updateUrl"ServerUrl"(服务器路径) WebClient wc new WebClient(); Stream stream wc.OpenRead(updateUrl); XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(stream); XmlNode list xmlDoc.SelectSingleNode("Update"); foreach (XmlNode node in…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019独角兽企业重金招聘Python工程师标准>>> Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/dat…

java 静态代码块_JAVA静态代码块

今天遇到下面的代码,感觉很奇怪,特意记录下:代码如下:public class Test {private static List objs new ArrayList();static {objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));objs.add(new Test(Test.S_NAME,Test.NAME,…

context详解

1、Context概念: Context,相信不管是第一天开发Android,还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源、启动一个新的Activity、获取系统服务、获取内部文件(夹)路径、创建View操作…

Unity Camera的两种模式

http://www.cnblogs.com/zhaoqingqing/p/3302484.html

mysql之group_concat函数

mysql之group_concat函数 在介绍GROUP_CONCAT之前,我们先来看看concat()函数和concat_ws()函数。 先准备一个测试数据库: mysql> select * from scores; --------------------- | id | name | score | --------------------- | 1 | zhangsan | 1…

java 图片批量上传_java实现批量上传图片,还要保证每个图片的顺序号,疑问求教!...

rt我要一次性同时上传n张照片,并且每张照片的顺序号还不一样,第一张的serialno是1,第二张是2。。一开始我做单张图片上传,代码如下RequestMapping("/picUpLoad")ResponseBodypublic Map picUpLoad(MultipartFile file, …

linux 用户创建、管理、权限分配

(1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证; sudo: sudo扮演的角色注定了…

WebApi路由

路由分为两种模式:模板路由和特性路由。 模板路由: 模板路由是ASP.NET Web API默认提供的路由。模板路由使用前需要定义路由模板。如下面默认的路由模板: 默认路由的URL格式是api/{controller}/{id}。api代表在资源前面要带上api目录&#xf…

HW--漂亮度2(测试通过)

总结:几个函数的使用 (1) int numInteger.parseInt(str[0]); //将第一个字符串转成整形数,表示名字个数 (2) String string1str[i].toLowerCase(); //变小写都 (3) char ch[]strin…

java设计模式 组合_JAVA 设计模式 组合模式

用途组合模式 (Component)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有唯一性。组合模式是一种结构型模式。结构图-组合模式结构图Component: 组合中的对象声明接口,在适当的情况下,实现所有类共…

项目总结SpringMVC相关

流程文字概述1、用户发送请求至前端控制器DispatcherServlet2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、DispatcherServlet调用Ha…

SpringBoot登录登出切面开发

阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本。 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验,即用户输入登录信息&#xff0c…

4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析

尊重开发人员的劳动成果。转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557Hello World 分析打开新建的"findmistress"项目,能够看到项目文件是由多个代码文件及目录组成的。当中 Hello World 的代码文件直…

spring --aop(日志记录)在工程中实际使用

2019独角兽企业重金招聘Python工程师标准>>> ###1.日志切面 package com.readygo.zbhealth.common;import java.util.Arrays; import java.util.List;import org.aspectj.lang.ProceedingJoinPoint;public class LoggingAspect {public Object Around(ProceedingJoi…

java 多表分页_多表单独查询组合结果的自定义分页(java代码)

多表单独查询组合结果的自定义分页实现(java代码)一、业务需求:遇到一个业务,需要多个表进行分页查询,使用union联合查询时,速度极其缓慢,即使查询的字段添加了索引,union查询好像不走索引,因此…

Neutorn LBaaS 原理

Load Balance as a Service(LBaaS)是 Neutron 提供的一项高级网络服务。LBaaS 允许租户在自己的网络中创建和管理 load balancer。 load balancer 可以说是分布式系统中比较基础的组件。 它接收前端发来的请求,然后将请求按照某种均衡策略转发…

判断一个图中有无环路的存在

这里要引入两个概念: 1.树边:是一条未被遍历过的边,它指向一个未被访问过的点。 2.反向边:是一条未被遍历过的边,它指向一个被访问过的点。 如果图中有环路的存在,那么环路的最后一个边必然是一条反向边。 …

精选的一些《编程之美》相关资料

又要到一年的招聘季了,肯定又有很多人开始啃《编程之美》了吧。这本书从开阔视野的角度来说很好,不过限于篇幅,有的问题并没有讲清楚(甚至问题叙述模棱两可、被标榜为“鼓励同面试官交流以获得更多细节”);…

java 内置函数_java8 四大内置核心函数式接口

其他补充接口:一、Consumer:消费型接口(void accept(T t))来看一个简单得例子:1 /**2 * 消费型接口Consumer3 */4 Test5 public void test1 () {6 consumo(500, (x) -> System.out.println(x));7 }89 public void consumo (double money, …