2019独角兽企业重金招聘Python工程师标准>>>

通道(Channel)用于在字节缓冲区(通道只能在字节缓冲区上操作)和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据,并且通道往往是和操作系统的文件描述符(File Descriptor)和文件句柄(File Handle)对应的,可以用最小的总开销来访问操作系统本身的I/O服务

通道基础

  类图结构如下所示

基本的Channel接口源码

package java.nio.channels;public interface Channel {public boolean isOpen( );  //通道是否打开public void close( ) throws IOException; //关闭一个打开的通道
}

InterruptibleChannel是一个标记接口,标示该通道是可以中断的(Interruptible),如果连接可中断通道的线程被中断,那么该通道会以特别的方式工作。大多数但非全部的通道都是可以中断的

类层次结构中有两个类位于一个不同的包:java.nio.channels.spi。这两个类AbstractInterruptibleChannel和AbstractSelectableChannel,它们分别为可中断的(interruptible)和可选择的(selectable)的通道实现提供所需的常用方法

打开通道

  IO可以分为File I/O和Stream I/O,通道也可以分为文件(file)通道和套接字(socket)通道,最常用的分别是FileChannel类和三个socket通道类:SocketChannel、ServerSocketChannel和DatagramChannel

Socket通道有可以直接创建新socket通道的工厂方法。但是一个FileChannel对象却只能通过在一个打开的RandomAccessFile、FileInputStream或FileOutputStream对象上调用getChannel( )方法来获取

package com.henrysun.javaSE.niostudy;import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.InetSocketAddress;
import java.nio.channels.DatagramChannel;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;/*** 打开通道*/
public class ChannelOpen {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {SocketChannel sc = SocketChannel.open();sc.connect(new InetSocketAddress("somehost", 8080));ServerSocketChannel ssc = ServerSocketChannel.open();ssc.socket().bind(new InetSocketAddress(8090));DatagramChannel dc = DatagramChannel.open();RandomAccessFile raf = new RandomAccessFile("somefile", "r");FileChannel fc = raf.getChannel();}}

使用通道

上面的类图结构,大部分零乱部分移除可以得到如下的UML图

public interface ReadableByteChannel extends Channel {public int read(ByteBuffer dst) throws IOException;
}public interface WritableByteChannel extends Channel {public int write(ByteBuffer src) throws IOException;
}public interface ByteChannel extends ReadableByteChannel, WritableByteChannel {
}

通道可以是单向的或者双向的,一个channel类可能实现定义read( )方法的ReadableByteChannel接口,而另一个channel类也许实现WritableByteChannel接口以提供write( )方法。实现这两种接口其中之一的类都只能在一个方向上传输数据。如果一个类同时实现这两个接口,那么它可以双向传输数据。这对于sockets不是问题,因为它一直是双向的,但是从FileInputStream对象的getChannel( )方法获取的FileChannel对象是只读的,因为FileInputStream对象总是以read-only的权限打开文件,尽管FileChannel实现了ByteChannel接口。调用write( )方法将抛出未经检查的NonWritableChannelException异常

通道可以以阻塞和非阻塞模式运行。非阻塞模式的通道永远不会让调用的线程休眠。请求的操作要么立即完成,要么返回一个结果表明未进行任何操作。只有面向流的(stream-oriented)的通道,如sockets和pipes才能使用非阻塞模式

:socket通道类从SelectableChannel引申而来。从SelectableChannel引申而来的类可以和支持有条件的选择(readiness selectio)的选择器(Selectors)一起使用。将非阻塞I/O和选择器组合起来可以使您的程序利用多路复用I/O(multiplexed I/O)

转载于:https://my.oschina.net/HerrySun/blog/737165

Java NIO 学习:通道(Channel)相关推荐

  1. Java NIO学习系列二:Channel

    上文总结了Java NIO中的Buffer相关知识点,本文中我们来总结一下它的好兄弟:Channel.上文有说到,Java NIO中的Buffer一般和Channel配对使用,NIO中的所有IO都起始 ...

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

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

  3. Java NIO 学习笔记(三)----Selector

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

  4. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

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

  5. Java NIO学习笔记之图解ByteBuffer

    转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...

  6. Java NIO学习篇之直接缓冲区和非直接缓冲区

    定义 以上是书深入理解java虚拟机对直接内存的描述.直接缓冲区用的就是直接内存. java nio字节缓冲区要么是直接的,要么是非直接的.如果为直接字节缓冲区,则java虚拟机会尽最大努力直接在此缓 ...

  7. Java NIO学习篇之NIO的基本认识

    定义: NIO:是从jdk1.4提出的,本意是New IO(相对于传统的IO),也叫 No Blocked IO(只相对于网络IO),它的出现弥补传统IO的不足,提出了更加高效的方式. NIO对于网络 ...

  8. java channel源码_彤哥说netty系列之Java NIO核心组件之Channel

    你好,我是彤哥,本篇是netty系列的第五篇. 欢迎来我的工从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Ja ...

  9. java channel源码_5. 彤哥说netty系列之Java NIO核心组件之Channel

    你好,我是彤哥,本篇是netty系列的第五篇. 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Java NIO的核心组件之一--Channel. 思维转变 首先, ...

  10. Java NIO学习系列六:Java中的IO模型

    前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...

最新文章

  1. CentOS上安装 jdk
  2. [异常解决] 安卓6.0权限问题导致老蓝牙程序出现异常解决办法:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission...
  3. base target=_self/IE6、IE7 用法(转)
  4. Python3 字典
  5. 搞定Linux Shell文本处理工具,看完这篇集锦就够了(转)
  6. 聚焦数字化智慧安防的新型社区
  7. html5 dropdownlist,使用HTML5 FindByValue下拉列表(html5 dropdownlist using F
  8. 用SQL语句创建Access表
  9. Spring Boot学习总结(20)——提升开发效率之热部署
  10. 【js】js传递对象
  11. hibernate4中HHH000273的错误
  12. Windows时间同步出错|无法获取服务器时间解决办法
  13. linux添加菜单栏,Gnome desktop主菜单中添加自己的菜单栏
  14. 保龄球计分程序java_保龄球计分程序
  15. cairo学习简单总结
  16. 十大报表工具 BI 产品深度点评-----BI报表行业专家干货分享----一文读懂报表与BI的行业现状----最新常用BI报表工具对比科普帖
  17. pdfjs 字体新增_JS - PDF文件生成库jsPDF使用详解2(修改文字样式)
  18. hadoop(hadoop是什么)
  19. 和菜头:放开那些员工
  20. WordPress大前端乐动体育指出:主题博客模板新增9个功能,修复7个bug

热门文章

  1. 00 欧几里得算法编程实现
  2. 亚马逊开店店铺选品技巧分析
  3. 斯坦福AI Lab主任Chris Manning:我的第一次CVPR
  4. 天河一号超级计算机研究成功,超级计算机“天河一号”研制成功
  5. Visual C++ 2005的现代语言特性
  6. BL-HUF35A-AV-TRB 电子元器件 BRIGHT 封装SMD 批次2021
  7. 华尔街日报:郭台铭的“紫禁城”
  8. matlab由两位随机整数构成的矩阵,建立5阶由两位随机整数构成的矩阵A,其语句是( )...
  9. 4-VIV-Android之PopupWindow
  10. ArcBlock ⑦ 月报 | Forge 框架升级更新 开发者社区建设如火如荼