Java 如何写入/读取我';你锁上了吗?
我正在编写一个线程化的程序,它可能会在多个JVM之间运行。锁定文件后,我在写入和读取文件时遇到问题(以防止其他进程/线程访问该文件)。我最初使用的是Java 如何写入/读取我';你锁上了吗?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在编写一个线程化的程序,它可能会在多个JVM之间运行。锁定文件后,我在写入和读取文件时遇到问题(以防止其他进程/线程访问该文件)。我最初使用的是FileWriter,但没有向该文件写入任何内容 现在,我正在尝试一个OutputStream,由于某些原因,文件中的新写入不会追加,因此只会出现最后一个条目。我做错了什么?锁定文件后,读/写文件的最佳方式是什么 注意:如果我删除所有锁,并使用FileWriter与PrintWriter组合使用,我没有这些问题,因此我认为我的锁定机制是错误的 try
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) {
}
一个更简单的解决方案是使用
当你使用
new FileWriter(os, true)
new PrintWriter(os,true)
然而,当您使用
new FileWriter(os, true)
new PrintWriter(os,true)
true
表示:;“换行符刷新”,即它将始终覆盖
当你需要做的是只写从文件的结尾。我建议你用
channel.position(channel.size());
在尝试追加之前。一个更简单的解决方案是使用
当你使用
new FileWriter(os, true)
new PrintWriter(os,true)
然而,当您使用
new FileWriter(os, true)
new PrintWriter(os,true)
true
表示:;“换行符刷新”,即它将始终覆盖
当你需要做的是只写从文件的结尾。我建议你用
channel.position(channel.size());
在您尝试追加之前。谢谢,我现在使用的是FileOutputStream,但现在我在回读时尝试锁定
FileInputStream
通道时,遇到了一个不可写的通道异常in@DanaDabbagh为了阅读,你可能需要皇家空军,你不需要附加模式来阅读。@DanaDabbagh顺便说一句,你可能会发现我的这个项目很有趣。它可以使用持久化共享内存实现您想要的功能,但不需要文件锁(无论如何很少)@Dana Dabbagh:当然,您不能在FileInputStream
上创建读/写(也称为独占)锁。您必须创建一个读取(也称为共享)锁。但是,你应该考虑,然后在文本I/O中考虑DeCurty或<代码>作者<代码>,而不是跳过十几个不同的API。谢谢,我现在使用的是FileOutputStream,但是现在当我试图在回读时锁定FileInputStream
通道时,我得到了一个不可写的通道异常in@DanaDabbagh对于阅读,您可能需要RAF,而不需要附加模式。@DanaDabbagh顺便说一句,您可能会发现我的这个项目很有趣。它可以使用持久化共享内存实现您想要的功能,但不需要文件锁(无论如何很少)@Dana Dabbagh:当然,您不能在FileInputStream
上创建读/写(也称为独占)锁。您必须创建一个读取(也称为共享)锁。但是你应该考虑,然后在文本I/O中考虑,然后写代码< >代码>,而不是跳过十几个不同的API…