总结了才知道,原来Java NIO的channel是这么用的!

Posted JavaEdge.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结了才知道,原来Java NIO的channel是这么用的!相关的知识,希望对你有一定的参考价值。

Java NIO的Channel类似流,是用于传输数据的数据流,但有不同:

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

从Channel读数据到缓冲区,从缓冲区写数据到Channel。

Channel(实现接口java.nio.channels.Channel的类)旨在提供往返NIO缓冲区的批量数据传输。这是与高层I/O库(包java.io和java.net)的类并行存在的底层数据传输机制。可以从高层的数据传输类(例如java.io.File,java.net.ServerSocket或java.net.Socket)获得Channel实现,反之亦然。Channel类似于在类似Unix的“文件描述符”。

FileChannel(java.nio.channels.FileChannel)可以使用任意缓冲区,但也可以使用m-map建立直接映射到文件内容的缓冲区。它们还可以与文件系统锁进行交互。同样,SocketChannel(java.nio.channels.SocketChannel和java.nio.channels.ServerSocketChannel)允许在Socket和NIO缓冲区之间进行数据传输。

FileChannel可用于进行文件复制,这可能比对字节数组使用旧的读/写方式要有效得多。典型用法:

// Getting file channels
try(FileChannel in = FileChannel.open(source, StandardOpenOption.READ);
    FileChannel out = FileChannel.open(target, StandardOpenOption.WRITE)
){
    // JavaVM does its best to do this as native I/O operations.
    in.transferTo(0, in.size(), out);
}

Channel的实现

Java NIO中最重要的Channel的实现:

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

Channel 示例

下面是一个使用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) {
  System.out.println("Read " + bytesRead);
  buf.flip();

  while(buf.hasRemaining()){
      System.out.print((char) buf.get());
  }

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

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

参考

  • http://tutorials.jenkov.com/java-nio/channels.html
  • https://en.wikipedia.org/wiki/Non-blocking_I/O_(Java)#Channels

以上是关于总结了才知道,原来Java NIO的channel是这么用的!的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO总结

JAVA NIO学习记录1-buffer和channel

Java I/O:NIO中的Channel

java nio知识点总结

NiO?是啥

Java NIO三组件——Selecotr/Channel实现原理解析