【问题标题】:Java NIO File Channel writing to fileJava NIO 文件通道写入文件
【发布时间】:2012-06-13 12:26:12
【问题描述】:

我正在通过互联网发送文件,接收方接收到文件的位置,当然还有数据,我应该从发送的位置开始将接收到的数据写入文件,但看起来 NIO 喜欢覆盖位置之前的任何数据。

所以我正在做的是

fc = new FileOutputStream(new File(file)).getChannel();

然后我从之前定义的 pos 开始写缓冲区

fc.write(buffer, pos);

当我发送的文件被分割成多个部分并将数据写入文件时,就像我展示的那样,由于某种原因,之前写入的数据被零覆盖

我还尝试过调试,例如检查它是否实际开始从该位置写入并且它工作正常并且在传输之间存在延迟,因此他们无法在文件上同时写入,这无论如何都不应该是问题.

我也关闭频道

fc.close();

因为我是分段发送文件,所以我无法将 fc 保存在内存中。

我的代码有什么问题,或者我怎样才能从 x 位置开始写入文件而不清空该位置之前的数据?

【问题讨论】:

  • fc.write(buffer, pos); 将字节从开头写入文件,但从缓冲区中的pos 位置开始。你确定你继续写文件吗?或者您将所有字节重写为文件的开头?
  • “我将文件分段发送,我无法将 fc 保存在内存中。”这对我来说没有任何意义。你是否厌倦了RandomAccessFile
  • Alaster,fc.write 将文件的位置作为参数,我确信 pos 设置正确,如我所说。彼得 好吧,我可以,但是如果可能的话,每次收到数据包时都更容易打开它,因为我认为这不是繁重的操作

标签: java io nio


【解决方案1】:

频道间复制的规范方式如下:

while (in.read(buffer) > 0 || buffer.hasRemaining())
{
  buffer.flip();
  out.write(buffer);
  buffer.compact();
}

如果您要关闭并重新打开文件,您需要在第一次之后以附加模式打开它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2018-07-07
    • 1970-01-01
    • 2019-10-20
    • 2018-12-25
    相关资源
    最近更新 更多