文档章节

Channel 通道的简介

kim_o
 kim_o
发布于 2017/07/20 23:01
字数 752
阅读 9
收藏 0
点赞 0
评论 0

1.Channel 通道的简介

Java的NIO的通道类似流,但是又有一些不同: 
- 既可以从Channel中读数据也可以往Channel里面写数据;但是流的读写一般是单向的。 
- Channel可以异步的读写; 
- Channel的读写是通过Buffer这个中介实现的。数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。如下图所示:

NIO的channel

引用一段关于描述Channel的文字:

其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为NIO可以使用异步的非堵塞模式才加入的东西。

以前的流总是堵塞的,一个线程只要对它进行操作,其它操作就会被堵塞,也就相当于水管没有阀门,你伸手接水的时候,不管水到了没有,你就都只能耗在接水(流)上。

NIO的Channel的加入,相当于增加了水龙头(有阀门),虽然一个时刻也只能接一个水管的水,但依赖轮换策略,在水量不大的时候,各个水管里流出来的水,都可以得到妥善接纳,这个关键之处就是增加了一个接水工,也就是Selector,他负责协调,也就是看哪根水管有水了的话,在当前水管的水接到一定程度的时候,就切换一下:临时关上当前水龙头,试着打开另一个水龙头(看看有没有水)。

当其他人需要用水的时候,不是直接去接水,而是事前提了一个水桶给接水工,这个水桶就是Buffer。也就是,其他人虽然也可能要等,但不会在现场等,而是回家等,可以做其它事去,水接满了,接水工会通知他们。 
这其实也是非常接近当前社会分工细化的现实,也是统分利用现有资源达到并发效果的一种很经济的手段,而不是动不动就来个并行处理,虽然那样是最简单的,但也是最浪费资源的方式。 
上面的比方还是相当清晰的描述了Channel、Buffer和Selector的作用。

2.Channel的最重要的几个实现以及使用场景

下面是Java的NIO的最重要的几个channel的实现: 
1. FileChannel 主要是用于文件的读写 
2. DatagramChannel 主要用于UDP读写网络中的数据 
3. SocketChannel 通过TCP读写网络中的数据。 
4. ServerSocketChannel 主要用于服务端:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

3. 一个FileChannel的基本实例;

RandomAccessFile accessFile = new RandomAccessFile("data.txt", "rw");
FileChannel inchannel = accessFile.getChannel();//获取 FileChannel

ByteBuffer buffer = ByteBuffer.allocate(48);//申请48字节的缓冲区

int bytesRead = inchannel.read(buffer);// 读取数据放入缓冲区

while(bytesRead != -1){
    System.out.println("read " + bytesRead);
    Thread.sleep(500);
    buffer.flip();
    bytesRead=-1;
}
while(buffer.hasRemaining()){
    System.out.print((char) buffer.get());
}
buffer.clear();
bytesRead = inchannel.read(buffer);
accessFile.close();
  •  

© 著作权归作者所有

共有 人打赏支持
kim_o
粉丝 1
博文 60
码字总数 32160
作品 0
深圳
程序员
java的NIO概述

概述 java中io输入输出流是阻塞的,如BufferedReader的readLine(),InputStrean的read()方法。当程序没有读到有效数据,程序将在此处阻塞。比较典型的是,在用socket传递数据,如果发送数据的...

EveryDayNew ⋅ 2015/12/28 ⋅ 0

02. Java NIO 概览

NIO包含下面几个核心的组件: Channels Buffers Selectors 整个NIO体系包含的类远远不止这几个,但是在笔者看来Channel,Buffer和Selector组成了这个核心的API。其他的一些组件,比如Pipe和F...

逝去的回忆 ⋅ 2016/11/21 ⋅ 0

NIO入门之NIO编程「NIO类库简介」

在介绍NIO编程之前,我们首先需要澄清一个概念:NIO到底是什么的简称?有人称之为New I/O,因为它相对于之前的I/O类库是新增的,所以被称为New I/O,这是它的官方叫法。但是,由于之前老的I...

柳哥 ⋅ 2015/01/20 ⋅ 0

ServerBootstrap

一 简介 1 Only for connection oriented transports 该类用于创建一个server端的通道,用于接收 例如 tcp 和 本地的连接,不能用于接收udp连接。 2 Parent channel and its children parent...

dyaodwjh ⋅ 2015/07/26 ⋅ 0

JAVA NIO 简介

基本 概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。 (c...

罗泽武 ⋅ 2013/12/16 ⋅ 1

RabbitMQ与消息队列模式

MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法; RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言)编写的,可复用的企业级消息系统; AMQP(高级消...

Java技术汇 ⋅ 05/15 ⋅ 0

关于BIO和NIO的理解

最近大概看了ZooKeeper和Mina的源码发现都是用Java NIO实现的,所以有必要搞清楚什么是NIO。下面是我结合网络资料自己总结的,为了节约时间图示随便画的,能达意就行。 简介:BIO:同步阻塞式...

天天顺利 ⋅ 2015/10/23 ⋅ 0

Netty 之传统 BIO、NIO 编程

说明 系列文章:http://www.jianshu.com/p/594441fb9c9e 本文完全参考自《Netty权威指南(第2版)》,李林峰著。 传统 BIO 编程是什么样的? 基本的网络编程模型是,即两个进程间相互通信,其...

被称为L的男人 ⋅ 2017/09/02 ⋅ 0

asterisk chan_sip.c代码分析

代码简介: Chansip.c是SIP协议(RFC3261)的实现代码,它没有实现对S/MIME, TCP and TLS的支持,对应的配置文件是sip.conf,代码所在的分组是:通道驱动类(channeldrivers)。 SIP通道处理各...

lichao19881026 ⋅ 2014/04/15 ⋅ 0

Go基础编程:并发编程—channel

goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。 引⽤类型 channel 是 CSP 模式的具体实现,用于多个 goroutine ...

tennysonsky ⋅ 01/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部