二 Channel

Java NIO的通道类似流,但又有些不同

  • 既可以从通道中读取数据,也可以写数据到通道。但是流的读写通常是单向的
  • 通道可以异步读写
  • 通道中的数据通常总是要先读到一个Buffer,或者总是从Buffer中写入

Channel实现类

  • FileChannel:从文件中读取数据
  • DatagramChannel:能通过UDP读写网络中的数据
  • SockeChannel:能通过TCP读写网络中的数据
  • ServerSocketChannel:可以监听新进来的TCP连接,像WEB服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

基本的Channel示例

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelDemo{
    public static void main(String[] args) throws Exception {
        RandomAccessFile rFile  = new RandomAccessFile("D:\\data.txt","rw");
        FileChannel inChannel = rFile.getChannel();
        ByteBuffer buf = ByteBuffer.allocate(48);
        int bytesRead = inChannel.read(buf);
        while(bytesRead != -1){
            System.out.println("Read "+bytesRead);
            buf.flip();
            while(buf.hasRemaining()){
                System.out.println((char)buf.get());
            }
            buf.clear();
            bytesRead = inChannel.read(buf);
        }
        rFile.close();
    }

}

注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取。

转载自并发编程网 – ifeve.com本文链接地址: Java NIO系列教程(二) Channel

posted @ 2017-02-19 22:50  孤独时光  阅读(377)  评论(0编辑  收藏  举报