LiangYongrui's Studio.

Java NIO Channel

2018/09/29 Share

本篇是Java NIO教程的第三篇。

目录

  1. java NIO 教程
  2. java NIO 概述
  3. java NIO Channel
  4. java NIO Buffer

概述

Java NIO Channels 很像流,他们有一些不同:

  • 你可以对Channels边读边写。而流通常是单向的。
  • Channels可以进行异步的读写。
  • Channels总是从一个Buffer中读取或写入。

如图所示,你可以把Channel中的数据读到Buffer中,也可以把Buffer中的数据写入到Channel:

Channel的实现类

下面四个是在Java NIO中最重要的Channel实现类:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel用于对文件进行数据读写。

DatagramChannel可以通过UDP来读写数据。

SocketChannel可以通过TCP来读写数据。

ServerSocketChannel允许你监听正在过来的tcp连接,类似于web服务器做的事情。对于每个正在过来的连接,会有一个SocketChannel被创建。

基础的Channel例子

下面是一个用FileChannel来读取一些数据到Buffer中的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// java 11
public static void main(String[] args) {
try (var file = new RandomAccessFile("data/test.txt", "rw")) {
FileChannel inChannel = file.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
while (true) {
int bytesRead = inChannel.read(buf);
System.out.println("Read " + bytesRead);
if (bytesRead == -1) {
break;
}
buf.flip();
while (buf.hasRemaining()) {
System.out.print((char) buf.get());
}
buf.clear();
}
} catch (IOException e) {
e.printStackTrace();
}
}

注意buf.flip()的调用。首先你把数据读取到Buffer,然后你flip它,然后你又把数据从buffer中读出来。下一篇文章中你将会看到更多关于Buffer的使用细节。

CATALOG
  1. 1. 目录
  2. 2. 概述
  3. 3. Channel的实现类
  4. 4. 基础的Channel例子