我写了一小段代码,可以概括为
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.do take()并将其保存为字符串 2.打开文件并写入
但即使我以这种方式更改代码,它也不能保证 文件在有人删除之前写完。
另一种选择是锁定文件,但我不想这样做。 我不想避免删除文件:)
答案 0 :(得分:0)
如果您要写入的文件可能会消失,那么最好的选择是不要保持流打开,而是在需要编写内容时重新创建一个新的FileOutputStream。这也将重新创建文件(我想这就是你想要的)。
或者您可以在每次写入之前检查文件是否存在。我认为两种方法在性能方面大致相同。
如果性能有问题,你可以在内存中缓冲,当缓冲区已满时,打开FileOutputStream(并在写出缓冲区后立即再次关闭它)。