文档章节

Channel 通道的简介

kim_o
 kim_o
发布于 2017/07/20 23:01
字数 752
阅读 9
收藏 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
粉丝 2
博文 79
码字总数 28082
作品 0
深圳
程序员
java的NIO概述

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

EveryDayNew
2015/12/28
149
0
02. Java NIO 概览

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

逝去的回忆
2016/11/21
19
0
NIO入门之NIO编程「NIO类库简介」

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

柳哥
2015/01/20
0
0
ServerBootstrap

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

dyaodwjh
2015/07/26
0
0
Hyperledger Fabric简介(6.1)

Fabric是一个提供模块化分布式账本解决方案的平台,并具备保密性、可伸缩性、灵活性和可扩展性等特性。Fabric具有可直接拔插启用和相互独立不同功能的模块,并能适应在经济社会中错综复杂的各...

灵·龙
08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

主流的消息队列MQ比较,详解MQ的4类应用场景

目前主流的MQ 1.ZeroMQ 号称最快的消息队列系统,尤其针对大吞吐量的需求场景。 扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发...

游人未归
42分钟前
2
0
React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
今天
2
0
Jenkins使用

clean install -Dmaven.test.skip=true

1713716445
今天
1
0
多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
3
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部