Java中的文件截断操作

hyd*_*yde 15 java file-io file

在Java中截断文件的最佳实践方法是什么?例如,这个虚拟函数,仅作为澄清意图的示例:

void readAndTruncate(File f, List<String> lines)
        throws FileNotFoundException {
    for (Scanner s = new Scanner(f); s.hasNextLine(); lines.add(s.nextLine())) {}

    // truncate f here! how?

}
Run Code Online (Sandbox Code Playgroud)

由于文件充当占位符,因此无法删除该文件.

Mor*_*sen 34

使用FileChannel#truncate().

    try (FileChannel outChan = new FileOutputStream(f, true).getChannel()) {
      outChan.truncate(newSize);
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果您在没有 append == `true` 的情况下打开,则该文件会立即被截断(您想要什么)。 (3认同)
  • 我更喜欢 FileChannel 方法,因为它在关闭输出流时不依赖副作用。也是一个更好的选择,因为它使代码更易于维护:调用 channel.truncate(newSize) 时不会发生混淆。如此多的错误隐藏在一系列无意后果的标题下。 (3认同)
  • 我最后做了一个简单的`try {new FileOutputStream(f).getChannel().truncate(0).close(); } catch(IOException e){/*log并忽略*/}`.问题:如果使用append == true打开文件是否重要? (2认同)

Evg*_*eev 8

new FileWriter(f) 将在打开时截断您的文件(到零字节),之后您可以向其写入行


ker*_*vin 5

使用一个衬垫Files.write() ...

Files.write(outFile, new byte[0], StandardOpenOption.TRUNCATE_EXISTING);
Run Code Online (Sandbox Code Playgroud)

也可以使用File.toPath()事先从File转换为Path。

还允许其他StandardOpenOptions