技术开发 频道

Java 7新I/O特性解析

  【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

  你可以使用下面这些方法操作位置和通道的大小。

  · 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();
    }
}
0
相关文章