【问题标题】:java BufferedWriter file deleted from other source从其他来源删除的 java BufferedWriter 文件
【发布时间】:2015-04-23 07:30:43
【问题描述】:

我写了一小段代码,可以概括为

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. 打开文件并写入文件

但即使我以这种方式更改代码,也不能保证 该文件在有人删除它之前被写入。

另一种选择是锁定文件,但我不想这样做。 我不想避免删除文件:)

【问题讨论】:

标签: java file bufferedwriter


【解决方案1】:

如果您正在写入的文件可能会消失,您最好的选择是不要让流保持打开状态,而是在您需要写入内容时重新创建一个新的 FileOutputStream。这也会重新创建文件(我想这就是你想要的)。

或者您可以在每次写入之前检查文件是否存在。我想这两种方法在性能方面大致相同。

如果性能有问题,您可以在内存中缓冲,当缓冲区已满时,打开 FileOutputStream(并在写出缓冲区后立即再次关闭它)。

【讨论】:

  • 如果应用程序崩溃或停止,将数据写入内存将导致问题(我总是可以写一个关闭挂钩或其他东西,但如果我的记忆没有让我失望,我不会发现 sigkill)。打开一个新的 FileOutputStream 只会减少我认为的问题,如果我打开 / 写入 / 关闭并且在打开 / 写入 / 关闭之间有一个 rm 在控制台上,我仍然会遇到问题。
  • 您说如果文件被删除也没关系(您不想阻止这种情况),那么为什么防止暴露于一秒钟的数据丢失如此重要呢?如果有人在一分钟后删除该文件,无论如何它都会消失,不是吗?
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2022-12-10
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多