gpt4 book ai didi

Java NIO。为什么 Flip() 方法会破坏我的程序?

转载 作者:行者123 更新时间:2023-12-01 06:56:07 25 4
gpt4 key购买 nike

下面的Java代码:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class Test {
public static void main(String args[]) throws IOException {

SocketChannel c = SocketChannel.open();
c.connect(new InetSocketAddress("google.com", 80));

ByteBuffer b = ByteBuffer.allocate(1024);
b.put("Request".getBytes());

System.out.println("Write: " + c.write(b));

int i;
while ((i = c.read(b)) != -1) {

System.out.println("Read: " + i);
b.clear();

}
}
}

实际结果:

Write: 1017 Read: 0 Read: 1024 Read: 44

第一次,方法read()读取0个字节。这并不酷。

我修改了我的代码:

    b.put("Request".getBytes());

System.out.println("Write: " + c.write(b));

b.flip(); //I added this line
int i;
while ((i = c.read(b)) != -1) {

System.out.println("Read: " + i);
b.clear();

}

实际结果:

Write: 1017 Read: 1024 Read: 44

看起来已经好多了。感谢flip()!

接下来,我放入缓冲区字符串“Request”,该字符串的长度7,但方法write()返回 1017. .

什么信息方法写入 channel ?

我不确定,该方法写入了字符串“Request”

好的,我再次修改了我的代码:

    b.put("Request".getBytes());

b.flip(); // I added this line
System.out.println("Write: " + c.write(b));

b.flip();
int i;
while ((i = c.read(b)) != -1) {

System.out.println("Read: " + i);
b.clear();

}

实际结果:

Write: 7

代码崩溃了...

为什么?我的错误在哪里?

谢谢。

最佳答案

在从缓冲区读取数据之前,需要调用flip方法。 flip() 方法,将缓冲区的 limit 重置为当前位置,并将缓冲区的 position 重置为 0。

因此,如果 ByteBuffer 中有 7 个字节的数据,则您的位置(从 0 开始)将为 7。flip()' 会使得限制 = 7位置 = 0。现在,可以进行读取了。

以下是有关如何最佳使用 flip() 的示例:

public static final void nioCopy(ReadableByteChannel input, WritableByteChannel output) throws IOException {
ByteBuffer buffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE);
while (input.read(buffer) != -1) {
//Flip buffer
buffer.flip();
//Write to destination
output.write(buffer);
//Compact
buffer.compact();
}

//In case we have remainder
buffer.flip();
while (buffer.hasRemaining()) {
//Write to output
output.write(buffer);
}
}

关于Java NIO。为什么 Flip() 方法会破坏我的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11581835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com