gpt4 book ai didi

java - 从 ByteBuffer 获取到 byte[] 不会写入 byte[]

转载 作者:行者123 更新时间:2023-12-02 07:54:29 25 4
gpt4 key购买 nike

我连续将 BLOCKSIZE(例如 512)字节 block 从 SocketChannel 读取到 ByteBuffer 中。然后我想将 ByteBuffer 内容附加到 byte[] 并进入下一轮。结果将是一个包含从 SocketChannel 读取的所有字节的 byte[]。

现在,System.arraycopy(...) 按预期工作。但是当我使用 ByteBuffer 的 get(result, offset, length) 时,什么也没有写入。结果数组值保持为零。

这是为什么?

  public final static int BLOCKSIZE = 512;

public byte[] getReceivedData() {
int offset = 0, read;
byte[] result = {};
ByteBuffer buffer = ByteBuffer.allocate(BLOCKSIZE);
try {
while (true) {
read = _socketChannel.read(buffer);
if (read < 1) {
// Nothing was read.
break;
}

// Enlarge result so we can append the bytes we just read.
result = Arrays.copyOf(result, result.length + read);

// This works as expected.
System.arraycopy(buffer.array(), 0, result, offset * BLOCKSIZE, read);

// With this, however, nothing is written to result. Why?
buffer.get(result, offset * BLOCKSIZE, read);

if (read < BLOCKSIZE) {
// Nothing left to read from _socketChannel.
break;
}

buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}

编辑:

我注意到 offset++ 也丢失了。因此,如果 channel 上的字节数超过 BLOCKSIZE ,事情就会变得困惑......

无论如何,ByteArrayOutputStream确实让事情变得更简单,所以我决定使用它。

工作代码:

  public byte[] getReceivedData() {
int read;
ByteArrayOutputStream result = new ByteArrayOutputStream();
ByteBuffer buffer = ByteBuffer.allocate(BLOCKSIZE);
try {
while (true) {
buffer.clear();
read = _socketChannel.read(buffer);
if (read < 1) {
break;
}
result.write(buffer.array(), 0, read);
if (read < BLOCKSIZE) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result.toByteArray();
}

最佳答案

您需要在 get() 之前flip() 缓冲区,并在之后 compact() 缓冲区。

如果read == -1,您不仅需要跳出循环,还需要关闭 channel 。

关于java - 从 ByteBuffer 获取到 byte[] 不会写入 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9819841/

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