如何锁定文件然后清除其内容?

时间:2017-06-24 18:12:38

标签: java file-io locking

如何锁定文件然后清除其内容并写入?清除文件可以很简单:

FileOutputStream fos = new FileOutputStream(someFileObject);

获得锁定将是:

FileLock lock = fos.getChannel().lock();

但我需要的是在清除之前锁定文件,因为我不想在程序获取文件锁之前进行任何编辑。

我尝试使用2个FileOutputStream对象,其中一个设置为append,仅用于锁定,另一个使用append设置为false以清除文件,如下所示:

    File log = new File("test.txt");
    try (FileOutputStream forLocking = new FileOutputStream(log, true)) {
        FileChannel fileChannel = forLocking.getChannel();
        FileLock lock = fileChannel.lock();
        try (FileOutputStream fos = new FileOutputStream(log); PrintWriter out = new PrintWriter(fos);) {
            out.println("Test this stuff");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

但显然只有拥有锁的频道才能在同一个jvm中对它进行任何更改。

无论如何我无需删除文件并重新创建它就能解决这个问题吗?

我很感激帮助。

@Roman Puchkovskiy我知道如何锁定。我知道如何清除文件。我的问题是如何获得锁定然后按相应的顺序清除文件。您发送的链接完全没有帮助,但感谢您尝试。

1 个答案:

答案 0 :(得分:0)

通过阅读文档,我发现您可以先创建RandomAccessFile实例,然后在其上调用getChannel。获得频道后,您可以lockchannel.truncate(0)清除其内容。然后,您可以通过调用channel.write(byteBuffer)继续写入文件。

这就是我的意思:

RandomAccessFile raFile = new RandomAccessFile(filename, 'rw');
FileChannel fc = raFile.getChannel();
fc.lock();
fc.truncate(0);
fc.write(someBuffer);
raFile.close(); // Will release the lock.