面试题答案
一键面试从Channel读取数据到Buffer
- 创建Buffer:首先根据需要读取的数据类型,创建相应类型的Buffer,如ByteBuffer、CharBuffer等。例如创建一个ByteBuffer:
ByteBuffer buffer = ByteBuffer.allocate(1024);
- 读取数据:通过Channel的
read
方法将数据读取到Buffer中。假设已有一个FileChannel
对象fileChannel
,执行int bytesRead = fileChannel.read(buffer);
,该方法返回读取的字节数。 - 切换Buffer状态:读取数据后,Buffer处于写模式,需要调用
buffer.flip()
方法切换到读模式,它会将position设为0,limit设为当前position的值。
从Buffer写入数据到Channel
- 准备数据:确保Buffer中已有要写入的数据。如果是刚从Channel读取数据并已切换到读模式的Buffer,可直接使用。
- 写入数据:通过Channel的
write
方法将Buffer中的数据写入Channel。例如对于SocketChannel
对象socketChannel
,执行socketChannel.write(buffer);
。 - 处理剩余数据:如果Buffer中的数据没有完全写入(返回值小于Buffer中剩余数据量),需要再次调用
write
方法,直到Buffer中的数据全部写入。另外,若写入完成后还需再次向Buffer写入数据,可调用buffer.clear()
或buffer.compact()
方法重置Buffer状态,clear
方法会将position设为0,limit设为容量大小;compact
方法会将未读取的数据移到Buffer起始位置,然后将position设为未读取数据的长度,limit设为容量大小 。