我正在编写一个具有线程的程序,可能会运行多个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) {
}
答案 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());
在尝试追加之前。