读书笔记-《Java NIO》:第三章 通道(1)

来源:互联网 发布:睡美人与魔纺锤 淘宝 编辑:程序博客网 时间:2024/06/02 02:07

封面准备出一个女神系列,第一期-孙燕姿O(∩_∩)O~,情歌一首《开始懂了》

今天学习第三章通道~~~


1. 通道是个什么东东?



最近南京地铁安检,大包小包都要过安检。有没有印象,有的安检机会佩带一个小筐,这个小筐就类似于缓冲区,安检机就是一个通道,数据放到筐里,由一端传送到另一端,就类似于数据放到缓冲区里,经通道由一端传送到另一端;在另一端从筐里拿出东西,就类似于接收端从缓冲区里取出数据。

通道就是一种途径,通过这种途径,可以用最小的开销访问操作系统本身的I/O服务。缓冲区就是通道内部用来发送和接收数据的端点。

2. 通道基础知识



先来看看顶层也是最基础的Channel类,它只包含两个方法isOpen()判断Channel是否已打开,close()关闭Channel;

1)顶层接口这样设计,证明这是所有Channel都共有的方法;

2)既然定义的是接口,那必然就涉及到实现,不同的操作系统通道的实现会有根本性差异;

3)接口只定义需要做什么,至于怎么做,不用管那些,有没有发现面向接口编程的好处^_^,面向接口编程的代码,可以轻松移植到实现完全不同的操作系统上。

I/O的广义上分为File I/O和Stream I/O


3. 怎么打开通道



Socket通道可以通过调用工厂方法open()打开;但是File通道就不行了,File通道必须通过在一个打开的RandomAccessFile、FileInputStream、FileOutputStream对象上调用getChannel()方法来获取。

4. 怎么使用通道



先来看一下Channel的UML类图

Channel分单向和双向,只实现ReadableByteChannel和WritableByteChannel其中一个接口的,属于单向Channel;两个都实现的,属于双向Channel。可能是为了省事,Java NIO又新定义了一个ByteChannel接口,这个接口并没有定义什么新方法,只是同时继承了ReadableByteChannel和WritableByteChannel接口。也就是说,如果我们想实现一个双向的接口,直接实现ByteChannel这个接口就好。


5. 怎么关闭通道



通道与缓冲区不同,它不能重复使用,一个打开的通道代表与一个特定的I/O
服务建立的特定连接。

在一个通道上多次调用close()方法没什么坏处,但是如果一个线程在调用close()的时候阻塞 , 那么在它完成关闭通道之前,其他调用close()方法的地方都会被阻塞,后续在已经关闭的通道上调用close()不会产生任何操作,只会立即返回。所以调用多次close()不会产生什么坏影响。


通道引入了一些与关闭和中断有关的新行为。

1) 如果一个通道实现了InterruptChannel,一个线程在这个通道上被阻塞同时被中断,那么该通道将被关闭,阻塞线程也会跑一个ClosedByInterruptExctption异常。

2) 如果一个线程的interrupt status被设置,并且该线程试图访问一个通道,那么这个通道将立即被关闭。


今天先到这儿,该睡觉了,明天继续(∩_∩)