Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已从其他源删除java BufferedWriter文件_Java_File_Bufferedwriter - Fatal编程技术网

已从其他源删除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,我仍然会有这个问题。你说如果文件被删除了没关系,你不想阻止它,那么,为什么防止一秒钟的数据丢失变得如此重要呢?如果有人在一分钟后删除该文件,它将全部消失,不是吗?