技术开发 频道

Java 7新I/O特性解析

  NetworkChannel

  现在所有网络通道都实现了新的NetworkChannel接口,你可以轻松绑定套接字管道,设置和查询套接字选项,此外,套接字选项也被扩展了,因此你可以使用操作系统特定的选项,对于高性能服务器这非常有用。

  异步I/O

  现在我们介绍最重要的新特性:异步I/O API,从它的名字我们就知道它有什么功能了,这个新的通道为套接字和文件提供了异步操作。

  当然,所有操作都是非阻塞的,但对所有异步通道,你也可以执行阻塞操作,所有异步I/O操作都有下列两种形式中的一种:

  · 第一个返回java.util.concurrent.Future,代表等待结果,你可以使用Future特性等待I/O操作结束;

  · 第二个是使用CompletionHandler创建的,当操作结束时,如回调系统,调用这个处理程序。

  下面是它们的一些例子,首先来看看使用Future的例子:

AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("Path to file"));
ByteBuffer buffer
= ByteBuffer.allocate(capacity);

Future result
= channel.read(buffer, 100); //Read capacity bytes from the file starting at position 100

boolean done = result.isDone(); //Indicate if the result is already terminated

  你也可以等待结束:

int bytesRead = result.get();

  或等待超时:

int bytesRead = result.get(10, TimeUnit.SECONDS); //Wait at most 10 seconds on the result

  再来看看使用CompletionHandler的例子:

Future result = channel.read(buffer, 100, null, new CompletionHandler(){
    
public void completed(Integer result, Object attachement){
        
//Compute the result
    }

    
public void failed(Throwable exception, Object attachement){
        
//Answer to the fail
    }
});

  正如你所看到的,你可以给操作一个附件,在操作末尾给CompletionHandler,当然,你可以把null当作一个附件提供,你可以传递任何你想传递的,如用于AsynchronousSocketChannel的Connection,或用于读操作的ByteBuffer。

Future result = channel.read(buffer, 100, buffer, new CompletionHandler(){
    
public void completed(Integer result, ByteBuffer buffer){
        
//Compute the result
    }

    
public void failed(Throwable exception, ByteBuffer buffer){
        
//Answer to the fail
    }
});

  正如你所看到的,CompletionHandle也提供Future元素表示等待结果,因此你可以合并这两个格式。

  下面是NIO.2中的所有异步通道:

  · AsynchronousFileChannel:读写文件的异步通道,这个通道没有全局位置,因此每个读写操作都需要一个位置,你可以使用不同的线程同时访问文件的不同部分,当你打开这个通道时,必须指定READ或WRITE选项;

  · AsynchronousSocketChannel:用于套接字的一个简单异步通道,连接、读/写、分散/聚集方法全都是异步的,读/写方法支持超时;

  · AsynchronousServerSocketChannel:用于ServerSocket的异步通道,accept()方法是异步的,当连接被接受时,调用CompletionHandler,这种连接的结果是一个AsynchronousSocketChannel;

  · AsynchronousDatagramChannel:用于数据报套接字的通道,读/写(连接)和接收/发送(无连接)方法是异步的。

0
相关文章