【问题标题】:How to lock a file then clear its contents? [duplicate]如何锁定文件然后清除其内容? [复制]
【发布时间】:2017-06-24 18:12:37
【问题描述】:

我怎样才能锁定一个文件然后清除它的内容并写入它?清除文件可以很简单:

FileOutputStream fos = new FileOutputStream(someFileObject);

获取锁将通过:

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

但我需要在清除文件之前锁定文件,因为我不希望在程序获得文件锁定之前进行任何编辑。

我尝试使用 2 个 FileOutputStream 对象,其中一个设置为追加,仅用于锁定,另一个将追加设置为 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();
    }

但显然只有拥有锁的 Channel 至少可以在同一个 jvm 中对其进行任何更改。

有没有我可以在不必删除文件并重新创建它的情况下进行此操作?

感谢您的帮助。

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

【问题讨论】:

    标签: java file-io locking


    【解决方案1】:

    通过阅读文档,我发现您可以先创建一个RandomAccessFile 实例,然后在其上调用getChannel。获得频道后,您可以lock 它,channel.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.
    

    【讨论】:

    • 谢谢,使用 FileOutputStream 也可以。我创建了一个附加设置为 true 的新通道,然后锁定通道并像您说的那样调用 truncate(0) 并清除文件。然后我通常使用印刷作家来写东西。
    • @OmarAlama 请查看编辑后的答案。我可能犯了一个错误。
    • 回复您的编辑:实际上只是创建流将简单地清除文件。除非您使用此构造函数 (someFileObject, true) 创建它,否则会将其设置为附加而不是清除。但是是的,截断(0)是我需要的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多