客户端程序里的buffer.flip()是不是用错了?

来源:8-7 客户端实现

慕田峪2263497

2020-02-17

在下面的代码注释中,前面的代码是不是应该使用buffer.clear()?
buffer.flip()不是使buffer变成读模式吗?而下边的clientChannel.read(buffer)是把通道里的数据写入buffer,所以,buffer应该调用clear方法使其变成写模式吧?

BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                String input = consoleReader.readLine();
                byte[] inputBytes = input.getBytes();
                ByteBuffer buffer = ByteBuffer.wrap(inputBytes);
                Future<Integer> writeResult = clientChannel.write(buffer);
                writeResult.get();
                buffer.flip();//这里是不是应该用buffer.clear()?
                Future<Integer> readResult = clientChannel.read(buffer);
                readResult.get();
                String echo = new String(buffer.array());
                buffer.clear();
                System.out.println(echo);
            }
写回答

1回答

Stannum

2020-04-12

同学你好~多谢你提出这个问题!我的讲解在这里是不准确的,一般来讲,将buffer从读模式转为写模式确实应该调用clear(),而不是flip(),我之后会在课程中加上一个注解来修改这个讲解中的问题

不过呢,在我们这个AIO tutorial的演示中,不管调用flip还是clear,buffer的position/limit/capacity指针都会处于相同的位置,因为这里的buffer从创建之初,它的limit和capacity就是指向同一个位置的。所以从效果上来看,调用flip和clear的效果是一样的。

0
1
慕斯1497386
我看到这里就感觉是clear(),翻了一下评论果然有人说,clear()就是clear(),你不能说这里效果是一样的就随便用,不规范,而且你源码里也没改过来,你画了好多饼啊,都2022年了,你之前所有评论里说的后续。。。根本就没后续了,我连QQ群都没加上去,加了好几次都没人管
2022-08-13
共1条回复

系统学习Java网络编程 深度理解BIO/NIO/AIO

对比式学习助你真正理解BIO/NIO/AIO三大网络编程模型。

880 学习 · 148 问题

查看课程