面试题答案
一键面试Channel数据传输方式
在Java NIO中,Channel主要通过与Buffer配合来进行数据传输。数据从Channel读取到Buffer中,或者从Buffer写入到Channel中。具体过程如下:
- 从Channel读取数据到Buffer:调用
channel.read(buffer)
方法,Channel将数据读取到传入的Buffer中。Buffer会记录读取的数据量和当前位置等信息。 - 从Buffer写入数据到Channel:调用
channel.write(buffer)
方法,Buffer将数据写入到Channel。同样,Buffer会记录写入的数据量和位置变化。
常见Channel类型及其数据传输方式
- FileChannel
- 数据传输方式:用于文件的读写操作。可以通过
read(ByteBuffer dst)
方法将文件数据读入ByteBuffer,也可以通过write(ByteBuffer src)
方法将ByteBuffer中的数据写入文件。例如:
- 数据传输方式:用于文件的读写操作。可以通过
RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
FileChannel channel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
buffer.flip();
// 处理数据
buffer.clear();
bytesRead = channel.read(buffer);
}
// 写入数据
buffer.put("Hello, World!".getBytes());
buffer.flip();
channel.write(buffer);
file.close();
- SocketChannel
- 数据传输方式:用于TCP网络套接字通信。通过
connect(SocketAddress remote)
方法连接到远程服务器,使用read(ByteBuffer dst)
从通道读取数据到ByteBuffer,write(ByteBuffer src)
将ByteBuffer中的数据写入通道发送出去。例如:
- 数据传输方式:用于TCP网络套接字通信。通过
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("localhost", 8080));
ByteBuffer buffer = ByteBuffer.wrap("Hello Server!".getBytes());
socketChannel.write(buffer);
buffer.clear();
int bytesRead = socketChannel.read(buffer);
if (bytesRead > 0) {
buffer.flip();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
System.out.println(new String(data));
}
socketChannel.close();
- ServerSocketChannel
- 数据传输方式:主要用于监听TCP连接,接受客户端连接后返回一个SocketChannel进行数据传输。通过
bind(SocketAddress local)
方法绑定到指定端口进行监听,使用accept()
方法接受客户端连接返回SocketChannel,之后就可以通过返回的SocketChannel的read
和write
方法像SocketChannel那样进行数据传输。例如:
- 数据传输方式:主要用于监听TCP连接,接受客户端连接后返回一个SocketChannel进行数据传输。通过
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
SocketChannel socketChannel = serverSocketChannel.accept();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = socketChannel.read(buffer);
if (bytesRead > 0) {
buffer.flip();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
System.out.println(new String(data));
buffer.clear();
buffer.put("Response from Server".getBytes());
buffer.flip();
socketChannel.write(buffer);
}
socketChannel.close();
serverSocketChannel.close();