RandomAccessFile() 的哪种模式会覆盖现有文件?

Sah*_*and 4 java

我想写入myFile.txt每次打开程序时调用的文件。如果之前运行的程序中存在具有该名称的文件,我希望它被覆盖。我该如何实现?我读过关于:

RandomAccessFile f = new RandomAccessFile("myFile.txt", "rw");
Run Code Online (Sandbox Code Playgroud)

但这会覆盖现有文件吗?文档没有告诉我是否有。请注意,完整删除旧文件很重要,如果我在当前运行中只覆盖其长度的一半,我不希望它的结尾仍然存在。

编辑: 通过测试,我发现“rw”不会删除现有文件,它只会覆盖文件顶部并保留其余文件。

我找到了满足我需求的替代解决方案:

    RandomAccessFile file = new RandomAccessFile("myFile.txt", "rw");
    file.setLength(0);
    file.write(contentBytes);
Run Code Online (Sandbox Code Playgroud)

但如果可以以更短的方式完成它会很好。

das*_*ght 5

RandomAccessFile没有在打开时删除文件的打开模式。您可以setLength(0)按照您建议的方式调用,在打开后立即截断它。您也可以获取FileChannel并调用truncate(0)它。

如果您RandomAccessFile仅用于编写contentBytes数组,则可以使用 来简化代码FileOutputStream,这会在打开时截断文件(除非您明确请求附加文件):

FileOutputStream fos = new FileOutputStream(f);
fos.write(contentBytes);
Run Code Online (Sandbox Code Playgroud)

我使用 RandomAccessFile 的原因是它允许我获取文件指针的位置,这是我在应用程序中需要的。

您应该能够从以下位置获得位置FileOuputStream

long pos = fos.getChannel().position();
Run Code Online (Sandbox Code Playgroud)