已从其他源删除java BufferedWriter文件
我写了一小段代码,可以概括为已从其他源删除java BufferedWriter文件,java,file,bufferedwriter,Java,File,Bufferedwriter,我写了一小段代码,可以概括为 Thread() { run() { BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(log, true), "UTF-8"));; while (true) { fileout.write(blockingQueue.take()); } } } 现在,其他一些线程将生成行并将它们添加到blockingQueue
Thread() {
run() {
BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(log, true), "UTF-8"));;
while (true) {
fileout.write(blockingQueue.take());
}
}
}
现在,其他一些线程将生成行并将它们添加到blockingQueue。
现在,如果我从控制台删除该文件,fileout.write不会失败,也不会抛出异常
我想知道如果有人从中删除该文件,我如何重新打开该文件
从控制台通过rm logfile.txt访问文件系统
问题不在于如何重新打开它,而在于如何检测文件已被删除
有些选择是
1.一定要把它保存到字符串中
2.打开文件并写入
但即使我以这种方式更改代码,也不能保证这一点
在有人删除文件之前先写入该文件
另一个选项是锁定文件,但我不想这样做。
我不想避免删除该文件:如果要写入的文件可能会消失,最好的选择是不要保持流打开,而是在需要写入内容时重新创建新的FileOutputStream。那也会重新创建文件,我想这就是你想要的 或者,您可以在每次写入之前检查文件是否存在。我认为这两种方法在性能方面大致相同
如果性能有问题,您可以在内存中设置缓冲区,当缓冲区已满时,打开FileOutputStream,并在写入缓冲区后立即再次关闭它。这里有一些解释,说明为什么可以在一个会话中删除文件,而在第二个会话中仍保持打开状态。//如果您在Unix系统上,代码将通过某种句柄处理文件。其他人删除该文件将从目录中删除该条目,但不会删除程序通过开放流持有的引用。当您关闭将其内容刷新到文件中并释放句柄的流时。然后文件将消失,因为没有引用仍然存在。我能看到的写入新文件的唯一方法是每次关闭它,然后重新打开它。如果应用程序崩溃或停止,将数据写入内存将导致问题。我总是可以编写一个关闭挂钩或其他东西,但如果我的内存没有故障,我不会执行catck sigkill。打开一个新的FileOutputStream只会减少这个问题,我想,如果我打开/写入/关闭,它不会同步,在打开/写入/关闭之间,控制台上有一个rm,我仍然会有这个问题。你说如果文件被删除了没关系,你不想阻止它,那么,为什么防止一秒钟的数据丢失变得如此重要呢?如果有人在一分钟后删除该文件,它将全部消失,不是吗?