三大组件
try(FileChannel channel = new FileInputStream(data.txt).getChannel()) {
// 缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
while(true) {
// 从channel读取数据,向buffer写入
int len = channel.read(buffer);
if(len == -1) {
break;
}
//切换至读模式
buffer.flip();
// 是否还有剩余未读数据
while(buffer.hasRemaining()) {
byte b = buffer.get();
System.out.println((char) b);
}
//切换至写模式
buffer.clear(); // compact()
}
}
结构:capaticy(buffer容量)、position(写入位置,指针)、limit(写入限制)
// 字符串转ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(16);
buffer.put("hello".getBytes());
// 使用Charset,会直接切换到读模式
ByteBuffer buffer = StandardCharsets.UTF_8.encode("hello")
// wrap
ByteBuffer buffer = ByteBuffer.wrap("hello".getBytes());
// 转String
String str = StandardCharsets.UTF_8.decode(buffer).toString()
private static void split(ByteBuffer source) {
// 读模式
source.flip();
for (int i = 0; i < source.limit(); i++) {
// 匹配到完整信息
if (source.get(i) == '\n') {
// 获取完整信息长度
int length = i + 1 - source.position();
ByteBuffer target = ByteBuffer.allocate(length);
for (int j = 0; j < length; j++) {
// 插入数据,更新position位置
target.put(source.get());
}
}
}
// 将半包状态下未读完数据移到前面
source.compact();
}