面试题答案
一键面试通道(Channel)和缓冲区(Buffer)协同工作原理
- 读取数据:
- 首先通过通道从网络连接(例如SocketChannel连接到远程服务器)读取数据。通道就像是数据传输的管道,负责从网络源头获取数据。
- 读取的数据不会直接进入应用程序处理逻辑,而是被写入到缓冲区中。缓冲区是一块内存区域,用于临时存储数据。
- 缓冲区提供了灵活的数据访问方式,它有容量(capacity)、位置(position)和限制(limit)等概念。当数据写入缓冲区时,position会随着写入的数据量而增加,limit通常表示缓冲区当前可写入或读取的数据界限。
- 写入数据:
- 应用程序处理完数据后,将数据放入缓冲区,同样,数据先进入缓冲区。
- 然后通过通道将缓冲区中的数据发送到网络连接,通道负责将缓冲区中的数据传输到目标网络端点。
示例代码
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class NIOExample {
public static void main(String[] args) {
try (SocketChannel socketChannel = SocketChannel.open()) {
socketChannel.connect(new InetSocketAddress("localhost", 8080));
// 发送数据
String message = "Hello, Server!";
ByteBuffer sendBuffer = ByteBuffer.wrap(message.getBytes());
socketChannel.write(sendBuffer);
// 接收数据
ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);
int bytesRead = socketChannel.read(receiveBuffer);
if (bytesRead > 0) {
receiveBuffer.flip();
byte[] data = new byte[bytesRead];
receiveBuffer.get(data);
System.out.println("Received: " + new String(data));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中:
- 发送数据:创建一个
ByteBuffer
并使用wrap
方法将字符串数据包装进去,然后通过SocketChannel
的write
方法将缓冲区的数据发送出去。 - 接收数据:先创建一个用于接收数据的
ByteBuffer
,调用SocketChannel
的read
方法将数据读取到缓冲区中,读取后调用flip
方法调整缓冲区的position和limit,以便正确读取数据。最后从缓冲区中取出数据并打印。