NIO.2入门异步通道API文件系统API.doc

上传人:自*** 文档编号:126187207 上传时间:2020-03-23 格式:DOC 页数:15 大小:102.50KB
返回 下载 相关 举报
NIO.2入门异步通道API文件系统API.doc_第1页
第1页 / 共15页
NIO.2入门异步通道API文件系统API.doc_第2页
第2页 / 共15页
NIO.2入门异步通道API文件系统API.doc_第3页
第3页 / 共15页
NIO.2入门异步通道API文件系统API.doc_第4页
第4页 / 共15页
NIO.2入门异步通道API文件系统API.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《NIO.2入门异步通道API文件系统API.doc》由会员分享,可在线阅读,更多相关《NIO.2入门异步通道API文件系统API.doc(15页珍藏版)》请在金锄头文库上搜索。

1、异步通道提供支持连接、读取、以及写入之类非锁定操作的连接,并提供对已启动操作的控制机制。Java 7 中用于 Java Platform(NIO.2)的 More New I/O APIs,通过在java.nio.channels包中增加四个异步通道,从而增强了 Java 1.4 中的 New I/O APIs(NIO): AsynchronousSocketChannel AsynchronousServerSocketChannel AsynchronousFileChannel AsynchronousDatagramChannel这些类在风格上与 NIO 通道 API 很相似。他们共享

2、相同的方法与参数结构体,并且大多数对于 NIO 通道类可用的参数,对于新的异步版本仍然可用。主要区别在于新通道可使一些操作异步执行。异步通道 API 提供两种对已启动异步操作的监测与控制机制。第一种是通过返回一个java.util.concurrent.Future对象来实现,它将会建模一个挂起操作,并可用于查询其状态以及获取结果。第二种是通过传递给操作一个新类的对象,java.nio.channels.CompletionHandler,来完成,它会定义在操作完毕后所执行的处理程序方法。每个异步通道类为每个操作定义 API 副本,这样可采用任一机制。异步套接字通道及特性首先,我们将了解Asy

3、nchronousServerSocketChannel和AsynchronousSocketChannel类。我们将看到的第一个例子将演示如何利用这些新的类来实施简单的客户端/服务器。第一步,我们要设置服务器。设置服务器打开AsychronousServerSocketChannel并将其绑定到类似于ServerSocketChannel的地址:AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open().bind(null);方法bind()将一个套接字地址作为其参数。找到空闲端口的便利方法是

4、传递一个null地址,它会自动将套接字绑定到本地主机地址,并使用空闲的临时端口。接下来,可以告诉通道接受一个连接:Future acceptFuture = server.accept();这是与 NIO 的第一个不同之处。接受调用总会立刻返回,并且, 不同于ServerSocketChannel.accept(),它会返回一个SocketChannel 它返回一个Future对象,该对象可在以后用于检索AsynchronousSocketChannel。Future对象的通用类型是实际操作的结果。比如,读取或写入操作会因为操作返回读或写的字节数,而返回一个Future。利用Future对象,

5、当前线程可阻塞来等待结果:AsynchronousSocketChannel worker = future.get();此处,其阻塞超时时间为 10 秒:AsynchronousSocketChannel worker = future.get(10, TimeUnit.SECONDS);或者轮询操作的当前状态,还可取消操作:if (!future.isDone() future.cancel(true);cancel()方法可利用一个布尔标志来指出执行接受的线程是否可被中断。这是个很有用的增强;在以前的 Java 版本中,只能通过关闭套接字来中止此类阻塞 I/O 操作。客户端设置接下来,要

6、通过打开并连接与服务器之间的AsynchronousSocketChannel,来设置客户端:AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); client.connect(server.getLocalAddress().get();一旦客户端与服务器建立连接,可通过使用字节缓存的通道来执行读写操作,如清单 1 所示:清单 1. 使用读写字节缓存/ send a message to the serverByteBuffer message = ByteBuffer.wrap(ping.getBytes(

7、);client.write(message).get();/ read a message from the clientworker.read(readBuffer).get(10, TimeUnit.SECONDS);System.out.println(Message: + new String(readBuffer.array();还支持异步地分散读操作与写操作,该操作需要大量字节缓存。新异步通道的 API 完全从底层套接字中抽取掉:无法直接获取套接字,而以前可以调用socket(),例如,SocketChannel。引入了两个新的方法 getOption和setOption 来在异

8、步网络通道中查询并设置套接字选项。例如,可通过channel.getOption(StandardSocketOption.SO_RCVBUF)而不是channel.socket().getReceiveBufferSize();来检索接收缓存大小。完成处理程序使用Future对象的替代机制,是向异步操作注册一个 callback 。接口CompletionHandler有两个方法: void completed(V result, A attachment)在任务完成结果中具有类型V时执行。 void failed(Throwable e, A attachment)在任务由于Throwab

9、le e而失败时执行。两个方法的附件参数都是一个传递到异步操作的对象。如果相同的对象用于多个操作,其可用于追踪哪个操作已完成。Open 命令我们来看一个使用AsynchronousFileChannel类的例子。可通过将java.nio.file.Path对象传递到静态open()方法中,来创建一个新的通道:AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(Paths.get(myfile);用于 FileChannel 的新 open 命令用于异步通道的 open 命令格式已被移植到FileChannel类。

10、在 NIO 中,通过在FileInputStream、FileOutputStream、或者RandomAccessFile上调用getChannel()来获取FileChannel。借助 NIO.2,可利用open()方法来直接创建FileChannel,此处展示了相关的例子。Path是 Java 7 中的新类。可利用Paths.get(String)实用方法,从代表文件名的String中创建Path。默认情况下,该文件已打开以供读取。open()方法可利用附加选项来指定如何打开该文件。例如,此调用打开文件以供读取或写入,如果必要将创建该文件,并在通道关闭或者 JVM 终止时尝试删除文件:f

11、ileChannel = AsynchronousFileChannel.open(Paths.get(afile), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);替代方法,open()提供了对通道的更好的控制,允许设置文件属性。实现一个完成处理程序接下来,可将这些写入文件,写入完成后,就可执行一些操作。 首先要构造一个封装了 “ something ” 的CompletionHandler,如清单 2 所示:清

12、单 2. 创建完成处理程序CompletionHandler handler = new CompletionHandler() Override public void completed(Integer result, Object attachment) System.out.println(attachment + completed with + result + bytes written); Override public void failed(Throwable e, Object attachment) System.err.println(attachment + fai

13、led with:); e.printStackTrace(); ;现在可以进行写入:fileChannel.write(ByteBuffer.wrap(bytes), 0, Write operation 1, handler);write()方法采取: 包含要写入内容的ByteBuffer 文件中的绝对位置 要传递给完成处理程序方法的附件对象 完成处理程序操作必须给出进行读或写的文件中的绝对位置。文件具有内部位置标记,来指出读/写发生的位置,这样做没有意义,因为在上一个操作完成之前,就可以启动新操作,它们的发生顺序无法得到保证。由于相同的原因,在AsynchronousFileChanne

14、lAPI 中没有用于设置或查询位置的方法,在FileChannel中同样也没有。除了读写方法之外,还支持异步锁定方法,因此,如果当前有其他线程保持锁定时,可对文件进行执行访问锁定,而不必在当前线程中锁定(或者利用tryLock轮询)。异步通道组每个异步通道都属于一个通道组,它们共享一个 Java 线程池,该线程池用于完成启动的异步 I/O 操作。这看上去有点像欺骗,因为您可在自己的 Java 线程中执行大多数异步功能,来获得相同的表现,并且,您可能希望能够仅仅利用操作系统的异步 I/O 能力,来执行 NIO.2 ,从而获得更优的性能。然而,在有些情况下,有必要使用 Java 线程:比如,保证 completion-handler 方法在来自线程池的线程上执行。默认情况下,具有open()方法的通道属于一个全局通道组,可利用如下系统变量对其进行配置: java.nio.channels.DefaultThreadPoolthreadFactory,其不采用默认设置,而是定义一个java.util.concurrent.ThreadFactory java.nio.channels.DefaultThreadPool.initialSize,指定线程池的初始规模java.nio.channels.AsynchronousChannelGroup中的三个实用方法提供了

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号