这是我在文件中附加行的最明显方法。 (如果文件不存在,则创建文件)
String message = "bla";
Files.write(
Paths.get(".queue"),
message.getBytes(),
StandardOpenOption.CREATE,
StandardOpenOption.APPEND);
但是,我需要在它周围添加(OS)锁定。我已经浏览了FileLock的示例,但是在Oracle Java教程中找不到任何规范示例,并且API对我来说非常难以理解。
答案 0 :(得分:2)
不在此代码周围。您必须通过FileChannel
打开文件,获取锁定,执行写入,关闭文件。或者释放锁定并保持文件打开,如果您愿意,所以您只需要下次锁定。请注意,文件锁只能保护您免受其他文件锁的攻击,而不是像您发布的代码那样。
答案 1 :(得分:2)
您可以锁定检索其流通道并锁定它的文件。
以下内容:
new FileOutputStream(".queue").getChannel().lock();
您也可以使用tryLock
,具体取决于您希望的顺畅程度。
现在要编写并锁定,您的代码将如下所示:
try(final FileOutputStream fos = new FileOutputStream(".queue", true);
final FileChannel chan = fos.getChannel()){
chan.lock();
chan.write(ByteBuffer.wrap(message.getBytes()));
}
请注意,在此示例中,我使用Files.newOutputStream添加了打开选项。
答案 2 :(得分:1)
您可以将锁定应用于FileChannel。
try {
// Get a file channel for the file
File file = new File("filename");
FileChannel channel = new RandomAccessFile(file, "rw").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();
/*
use channel.lock OR channel.tryLock();
*/
// Try acquiring the lock without blocking. This method returns
// null or throws an exception if the file is already locked.
try {
lock = channel.tryLock();
} catch (OverlappingFileLockException e) {
// File is already locked in this thread or virtual machine
}
// Release the lock - if it is not null!
if( lock != null ) {
lock.release();
}
// Close the file
channel.close();
} catch (Exception e) {
}
有关更多内容,您可以阅读本教程: