如何写/读到我锁定的文件?

时间:2016-09-05 14:05:15

标签: java multithreading concurrency

我正在编写一个具有线程的程序,可能会运行多个JVM。我在锁定文件时遇到写入和读取文件的问题(以防止其他进程/线程访问它)。我最初使用FileWriter但没有写入文件。

现在我正在尝试OutputStream,由于某种原因,对该文件的新写入将不会附加 - 因此只会显示最后一个条目。我究竟做错了什么?一旦锁定文件,读取/写入文件的最佳方法是什么?

注意:如果我删除所有锁并使用FileWriter并结合PrintWriter我没有这些问题,所以我认为我的锁定机制是错误的

try {
    // Get a file channel for the file
    File file = new File ( path );
    RandomAccessFile stream = new RandomAccessFile(file, "rw");
    FileChannel channel = stream.getChannel();

    // Use the file channel to create a lock on the file.
    // This method blocks until it can retrieve the lock.
    FileLock lock = channel.lock();

    OutputStream os = Channels.newOutputStream(channel);

    try (PrintWriter pw = new PrintWriter(os,true)){
        System.out.println("Writing "  + message);
        pw.println(message);
    }
    os.close();
    // Release the lock - if it is not null!
    if( lock != null ) {
        lock.release();
    }
    stream.close();
    // Close the file
    channel.close();

} catch (Exception e) {
}

1 个答案:

答案 0 :(得分:2)

更简单的解决方案是使用FileOutputStream

FileOutputStream os = new FileOutputStream(path, true);
FileChannel channel = os.getChannel();

使用时

new FileWriter(os, true)

true意味着"追加模式"但是当你使用

new PrintWriter(os,true)

true表示; "在新线上冲洗"即它将始终覆盖

当你需要做的只是从文件的末尾写。我建议你用

channel.position(channel.size());
在尝试追加之前