Channel

作者: JiinYuu | 来源:发表于2018-12-04 22:21 被阅读0次

Java NIO的Channel和流很像,但又有些不同:

  • 你可以用同一个Channel来读和写,但流是单向的(读或写);
  • Channel支持异步读写;
  • Channel总是从Buffer读,以及写入Buffer,即Channel只和Buffer打交道。

如上所述,你从Channel读入数据到Buffer,从Buffer写数据到Channel。如下图:

Channel将数据读入Buffer,Buffer将数据写入Channel

Channel Implementations

以下是Java NIO中最重要的几个Channel实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel从文件读取数据。

DatagramChannel以UDP协议读写网络数据;

SocketChannel通过TCP协议读写网络数据;

ServerSocketChannel允许你像一个web服务器一样监听接入的TCP连接。每个接入连接都会都一个对应的SocketChannel

Basic Channel Example

以下是一个使用FileChannel读取数据到Buffer的简单例子:

RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
    buf.flip();
    
    while (buf.hasRemaining()) {
        System.out.print((char) buf.get());
    }

    buf.clear();
    bytesRead = inChannel.read(buf);
}
aFile.close();

注意buf.flip()这个调用。首先将数据读入Buffer,然后flip,然后get。下篇文章我会详细介绍Buffer的更多细节。

说明

发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO

相关文章

网友评论

      本文标题:Channel

      本文链接:https://www.haomeiwen.com/subject/eofbcqtx.html