JAVA NIO Channel
Basic:
多数通道都是链接到开发的文件描述符的。Channel类提供维持平台独立性的抽象过程。
通道是一种途径,访问和操作操作系统,缓冲区是数据操作点:
Channel类继承结构图:
通过API主要由接口指定(面向接口),通道实现经常要操作本地操作系统的代码,所以不同操作系统的实现会有根本的差异性,通道接口允许以可控且可抑制的方式来访问底层IO.
IO广义两大类:
File IO、Stream IO 《==》通道两大类:FileChannel(文件通道)、SocketChannel-ServerSocketChannel-DatagramChannel(套接字通道)。
通道的单向和双向:
实现ReadableByteChannel read()方法《==》实现WritableByteChannel write()方法。
ByteChannle:
只是一个提供继承便捷的借口。简化类定义的语法糖。所有通道基本都是双向的。
通道会连接一个特定的IO服务,且通道实例性能受所连接的IO服务的特征限制。
ByteChannel 的read()和write()方法是用ByteBuffer作为参数,返回已传输的字节数,比缓冲区的字节数少或者可能为0,因为一次输出不完,缓冲去的位置会与已传输字节相同数量的前移,如果只进行了部分传输,缓冲区可以被重新提交给通道,并从上次中断的地方继续传输(基于Buffer的positon属性,继续操作postion到limit的数据)。该过程重复进行,直到Buffer.hasRemaining()方法返回false:如下:
/**
* 基于基本channel buffer的文件复制操作
*/
public static void fileTransferByNormal() {
try {
RandomAccessFile afile = new RandomAccessFile("hello.txt", "rw");
RandomAccessFile bfile = new RandomAccessFile("hehe.txt", "rw");
FileChannel ac = afile.getChannel();
FileChannel bc = bfile.getChannel(); ByteBuffer bf = ByteBuffer.allocateDirect(16 * 1024);
while (ac.read(bf) != -1) {
bf.flip();
while (bf.hasRemaining()) {
bc.write(bf);
}
bf.clear();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Blocking Nonblocking:非阻塞模式不会让调用的线程休眠,要么请求立即完成,或者返回误操作。Stream-oriented可以设置nonblocking。
Socket Channel 继承自SelectableChannel=》Selectors=》多路复用。(非阻塞IO)。
通道关闭:
通道不能被重复利用,打开的通道代表与一个特定IO服务的特定链接并封装该链接的状态,通道关闭则链接丢失。
通道上的多次close(),无影响。
如果一个线程在一个通道上被阻塞同时被中断,则该通道将被关闭,线程抛出ClosedByInterruptException异常。
一个线程的interrupt status被设置,且该线程视图访问一个通道,那么这个通道会被关闭,并抛出ClosedByInterruptException异常。
通道上休眠线程的中断区别于selectors上的休眠线程的中断。
实现InterruptableChannel的Channel可以在任何时候被关闭,同时通道上的休眠线程会被唤醒并接收到一个AsynchronousInterruptedException。异步关闭。
JAVA NIO Channel的更多相关文章
- Java NIO Channel和Buffer
Java NIO Channel和Buffer @author ixenos Channel和Buffer的关系 1.NIO速度的提高来自于所使用的结构更接近于OS执行I/O的方式:通道和缓冲器: 2 ...
- Java NIO Channel之FileChannel [ 转载 ]
Java NIO Channel之FileChannel [ 转载 ] @author zachary.guo 对于文件 I/O,最强大之处在于异步 I/O(asynchronous I/O),它允许 ...
- Java NIO Channel通道
原文链接:http://tutorials.jenkov.com/java-nio/channels.html Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以 ...
- (三:NIO系列) Java NIO Channel
出处: Java NIO Channel 1.1. Java NIO Channel的特点 和老的OIO相比,通道和NIO流(非阻塞IO)主要有以下几点区别: (1)OIO流一般来说是单向的(只能读或 ...
- [翻译] java NIO Channel
原文地址:http://tutorials.jenkov.com/java-nio/channels.html JAVA NIO channels和流的概念很像,下面是他们的一些区别: 你可以对cha ...
- Java NIO Channel to Channel Transfers通道传输接口
原文链接:http://tutorials.jenkov.com/java-nio/channel-to-channel-transfers.html 在Java NIO中如果一个channel是Fi ...
- Java NIO Channel to Channel Transfers
In Java NIO you can transfer data directly from one channel to another, if one of the channels is a ...
- Java NIO Channel 使用
Java NIO 中的 Channel 分类: FileChannel SocketChannel ServerSocketChannel DatagramChannel channel 分类 Fil ...
- 【JAVA】【NIO】3、Java NIO Channel
Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...
随机推荐
- CSharpGL(10)两个纹理叠加
CSharpGL(10)两个纹理叠加 本文很简单,只说明如何用shader实现叠加两个纹理的效果. 另外,最近CSharpGL对渲染框架做了修改,清理一些别扭的内容(DoRender()前后的事件都去 ...
- CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面
CentOS 6.8 有默认的安装的 vnc 位于端口 5900 : 系统->首选项->远程桌面 勾选[共享]的选项, 取消勾选[安全]的选项, 然后防火墙添加 5900 端口 基本就可 ...
- 【Win 10 应用开发】导入.pfx证书
这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...
- ROC曲线、PR曲线
在论文的结果分析中,ROC和PR曲线是经常用到的两个有力的展示图. 1.ROC曲线 ROC曲线(receiver operating characteristic)是一种对于灵敏度进行描述的功能图像. ...
- .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?
旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基元类型,也可以是一个自定义数据类型,还可以是一个数组.集合或者字典类 ...
- javascript中Array的操作
concat(组合数组) join(数组转字符串) pop(删除最后一个元素) shift(删除第一个元素) push(在数组尾部添加新元素) unshift(在数组头部添加新元素) slice(不改 ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- BFC的形成条件和特性分析
初学CSS时,我们学到很多有意思的CSS规则,比如外边距塌陷,还有浮动元素的一些特性等,其实这些规则背后都是BFC这个东西在控制,下面我们来看下BFC到底是什么. 什么是BFC BFC(Block f ...
- .NET Core Windows环境安装与体验
1.安装.NET Core SDK 在windows下开发.NET Core最好使用Visual Studio工具.下载地址与安装: VS2015最新版本:Visual Studio 2015 Upd ...
- android手机旋转屏幕时让GridView的列数与列宽度自适应
无意中打开了一年前做过的一个android应用的代码,看到里面实现的一个小功能点(如题),现写篇文章做个笔记.当时面临的问题是,在旋转屏幕的时候需要让gridview的列数与宽度能自适应屏幕宽度,每个 ...