【IT168 分析】Java 7提供了一个新API访问文件系统,但除此之外,JSR 203(NIO.2)还包含其它很多新特性,这个新版本的确新增了很多改善I/O编程的类,本文将会介绍下面的新特性:
· SeekableByteChannel:随机访问通道;
· MulticastChannel:允许IP多播的通道;
· NetworkChannel:新的网络通道超级接口;
· 异步I/O API:新的API使I/O操作可以异步进行。
SeekableByteChannel
首先,Java 7包括新的ByteChannel – SeekableByteChannel,这个通道维护当前的位置,你可以读写该位置,并允许随机访问。使用这个类型的通道,你可以添加多个线程读/写在不同位置相同的线程。
SeekableByteChannel channel1 = Paths.get("Path to file").newByteChannel(); //Simply READ
SeekableByteChannel channel2 = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ, StandardOpenOption.WRITE); //READ and WRITE
SeekableByteChannel channel2 = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ, StandardOpenOption.WRITE); //READ and WRITE
你可以使用下面这些方法操作位置和通道的大小。
· long position():返回目前的位置;
· long size():返回通道连接实体的当前大小,如通道连接的文件大小;
· position(long newPosition):移动当前位置到某个地方;
· truncate(long size):根据给定大小截断实体。
position()和truncate()方法简单地返回当前通道,允许链式调用。
现在FileChannel实现了新的接口,使用所有FileChannel你都可以实现随机访问,当然你可以用它读取一个文件:
SeekableByteChannel channel = null;
try {
channel = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ);
ByteBuffer buf = ByteBuffer.allocate(4096);
System.out.println("File size: " + channel.size());
String encoding = System.getProperty("file.encoding");
while (channel.read(buf) > 0) {
buf.rewind();
byte[] bytearr = new byte[bytebuff.remaining()];
buf.get(bytearray);
System.out.print(new String(bytearray));
buf.flip();
System.out.println("Current position : " + channel.position());
}
} catch (IOException e) {
System.out.println("Expection when reading : " + e.getMessage());
e.printStackTrace();
} finally {
if (sbc != null){
channel.close();
}
}
try {
channel = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ);
ByteBuffer buf = ByteBuffer.allocate(4096);
System.out.println("File size: " + channel.size());
String encoding = System.getProperty("file.encoding");
while (channel.read(buf) > 0) {
buf.rewind();
byte[] bytearr = new byte[bytebuff.remaining()];
buf.get(bytearray);
System.out.print(new String(bytearray));
buf.flip();
System.out.println("Current position : " + channel.position());
}
} catch (IOException e) {
System.out.println("Expection when reading : " + e.getMessage());
e.printStackTrace();
} finally {
if (sbc != null){
channel.close();
}
}