【问题标题】:Is there an efficient way to "crop" a file (remove x number of bytes from tail)?有没有一种有效的方法来“裁剪”文件(从尾部删除 x 个字节)?
【发布时间】:2012-01-22 04:39:10
【问题描述】:

大家下午好。我想知道我们如何有效地从文件末尾删除 x 个字节? (追加的逆运算)

从原始文件读取字节并将它们写入新文件似乎并不正确(快速),尤其是在文件很大的情况下。

有没有办法可以设置file length

或者更确切地说,“裁剪”文件的最佳方式是什么?

【问题讨论】:

  • 我认为只有当操作系统像这样管理文件截断时(并且如果它允许外部调用者访问可能是内核)

标签: java file io


【解决方案1】:

【讨论】:

  • 您确定这不会将内容重写为新文件吗?
  • 为什么要这样?文档指出该文件已被截断,这正是所要求的。
  • 是的,它会截断,但 Pacerier 想要确保文件不会被重写到磁盘的另一部分(我的理解),但它的字节应该位于同一位置。切掉的字节应标记为 HDD 上的可用空间。鉴于这些假设,我不确定是否有人可以声称所有 JVM 实现都会在调用 setLength() 时执行此操作……只是我的想法。我可能会误解
  • 除非文件系统的行为非常奇怪,在大多数情况下,当大小减小甚至增加时,没有理由进行字节移动。文件在磁盘上不必是连续的。
  • @tzaman 是的,我正在寻找一种方法来简单地告诉硬盘文件在位置 x 处结束。最重要的是这个操作应该很快,所花费的时间一般不应该随着文件的大小线性增加。你的意思是说RandomAccessFile.setLength 是我们最好的选择吗?
【解决方案2】:

我有 2 个答案给你。

  • 如果您不想手动读取、截断和重写文件,但不关心这些操作是否可能在幕后发生,您可以使用@987654321 @正如 tzaman 指出的那样。

  • 如果您不希望文件的字节被重写到新的磁盘位置(您只希望末尾的字节在磁盘上标记为空闲(副作用:碎片)),我不认为这是可能的。您必须查看底层操作系统是否实现了这样的文件截断(通过与硬件交谈)。我还不熟悉这些选项。此外,还有不同的 JVM 实现,无法保证它们如何在幕后运行您的代码。

虽然后一种方法的最大问题是磁盘碎片。如果将文件作为一个整体重写,操作系统可能有更好的方法来组织文件;但这取决于。也许您可以为这个特定的应用程序编写自己的操作系统。 ;)

【讨论】:

  • 写“自己的操作系统”是什么意思?
  • @Pacerier 好吧,我只是把它扔在那里完成......如果你真的需要这个功能(文件截断要快)你会编写你自己的操作系统来保证它会截断你想要的方式。然后你会在这个操作系统上运行 JVM,所以当你可以使用一些 truncate() 函数时,你的操作系统会满足你的需要。
  • 这就是我不理解的。这如何帮助我们在运行 Java 代码的窗口上实现 truncate()?
  • @Pacerier 你会在你的操作系统而不是 Windows 上运行 java
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多