技术开发 频道

JDK 7探秘四:下一代I/O(NIO.2)

  我创建了一个程序演示创建和接收读操作状态的通知,其代码如清单3所示。

  清单3. AFCDemo2.java

// AFCDemo2.java
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.channels.CompletionHandler;
import java.nio.file.Path;
import java.nio.file.Paths;
public class AFCDemo2
{
  
static Thread current;
  
public static void main (String [] args) throws Exception
   {
      
if (args.length != 1)
      {
          System.err.println (
"usage: java AFCDemo1 path");
          
return;
      }
      Path path
= Paths.get (args [0]);
      AsynchronousFileChannel ch
= AsynchronousFileChannel.open (path);
      ByteBuffer buf
= ByteBuffer.allocate (1024);
      current
= Thread.currentThread ();
      ch.read (buf,
0, null,
              
new CompletionHandler<Integer, Void> ()
               {
                  
public void completed (Integer result, Void v)
                   {
                      System.out.println (
"Bytes read = "+result);
                      current.interrupt ();
                   }
                  
public void failed (Throwable exc, Void v)
                   {
                      System.out.println (
"Failure: "+exc.toString ());
                      current.interrupt ();
                   }
               });
      System.out.println (
"Waiting for completion");
      
try
      {
          current.join ();
      }
      
catch (InterruptedException e)
      {
      }
      System.out.println (
"Terminating");
      ch.close ();
   }
}

  上面的代码调用AsynchronousFileChannel's public abstract void read(ByteBuffer dst, long position, A attachment, CompletionHandler handler)方法异步读取前1024字节。

  虽然我们只演示了单一的读操作,但attachment部分也很重要,上面的代码演示了传递一个null给read()方法,并指定附加类型为Void。

  完整的套接字通道功能

  JSR 51的DatagramChannel,ServerSocketChannel和SocketChannel类没有完整抽象一个网络套接字,为了绑定通道的套接字,或为了获得/设置套接字选项,你必须先调用每个类的socket()方法检索对等套接字。

  JSR 51生效时没有时间定义完整的套接字通道API,因此形成了套接字通道和套接字API混合的局面,JSR203引入新的java.nio.channels.NetworkChannel接口解决了这个问题。

  NetworkChannel提供了将套接字绑定到本地地址,返回绑定地址,以及获得/设置套接字选项的方法,这个接口是通过同步和异步套接字类实现的,不再需要调用socket()方法。

  JSR 203也引入了新的java.nio.channels.MulticastChannel接口,它为DatagramChannel提供了IP多播的支持,以及对应的异步支持。

  总结

  本系列文章介绍了即将发布的JDK 7包含的一些新特性,新的里程碑版本可能很快就会发布,你现在就可以尝试一下这些新特性,也许Oracle/Sun将会增加更多的新特性,如JWebPane浏览器组件,因为之前Sun就曾用闭包让我们惊讶过一次了。

0
相关文章