我创建了一个程序演示创建和接收读操作状态的通知,其代码如清单3所示。
清单3. 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就曾用闭包让我们惊讶过一次了。