gpt4 book ai didi

java - 文件 channel 读取/添加错误数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:14 25 4
gpt4 key购买 nike

我正在使用带有字节缓冲区的文件 channel 通过网络发送数据包。我的问题是,当文件 channel 读取最后几个字节时,它会附加从先前读取的字节读取的最后一位数据,即使我在写入后清除了字节缓冲区。

例如,

字节缓冲区大小 = 512对于最后一次迭代,要发送的剩余字节数为 372。它读取了最后的 372 个字节,但还在其末尾附加了另外 140 个字节 (512-372),最后 140 个字节似乎来自之前发送的 512 个字节。

这是我的代码:

ByteBuffer bBuffer = ByteBuffer.allocate(512);

while (fChannel.read(bBuffer) > 0) {

bBuffer.flip();
datagramChannel.write(bBuffer);
bBuffer.clear();

//omitted code
}

最佳答案

  1. 以这种方式使用 DatagramChannel 绝对行不通。您只是发送可能会或可能不会到达,或两次或更多次以任何顺序到达的文件 block 。使用 TCP。

  2. 即使它确实神奇地工作,我怀疑“省略的代码”或接收代码中还有更多错误:

    while (fChannel.read(bBuffer) > 0) {

    bBuffer.flip();
    datagramChannel.write(bBuffer);
    bBuffer.clear();

    //omitted code
    }

    Java中 channel 间复制循环的正确版本如下:

    while (fChannel.read(buffer) > 0 || buffer.position() > 0) {    
    buffer.flip();
    datagramChannel.write(bBuffer);
    buffer.compact();
    }

    请注意,您必须在缓冲区中仍有内容时继续写入 (buffer.position() > 0),并且您必须使用 compact() 而不是clear() 以免假定 write() 清空了缓冲区。

  3. 如果它不是 DatagramChannel,您应该使用比 512 大得多的缓冲区,例如 8192。

关于java - 文件 channel 读取/添加错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26981232/

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