2012-04-23 90 views
1

我用FileOutputStream fos创建/追加和写入到一个单独的线程调试文件:当文件被删除时,FileOutputStream写入不会引发异常?

fos = new FileOutputStream(outputFile, true); 
    if (!outputFile.exists()) { 
    outputFile.createNewFile(); 
    } 
    fos.write(string.getBytes()); 

此代码不断beeing称为一个循环,而用户可能被清除=从另一个线程随时删除该文件启动重新记录调试输出。

现在我真的很惊讶,当文件beeing删除此代码运行通过没有引发任何异常,但没有任何反应。即该文件不再被重新创建,也没有任何东西被写入。所有的“写”都丢失了。

在每次调用fos.write之前,我是否真的必须一直手动检查文件是否已被删除?

如果异常会像预期的那样工作,即写入已删除的文件时,它会更简单和更清晰。

回答

4

这完全取决于操作系统。在Windows上,您不会能够删除该文件;但是在类UNIX系统上,这只是它的工作方式,与编程语言无关。鉴于一个文件可以有多个可以独立删除的链接,你应该明白为什么这个行为是有道理的。事实上,它会导致更容易和更干净的行为,而不是文件被删除时的爆炸。

+0

谢谢你的明确答案 - 但我不确定我是否真的同意“而事实上,它导致更容易和更干净的行为,而不是文件被删除时爆炸会。”有一个干净的例外来处理这种情况并不真正“爆炸”。尽管如此 - 非常感谢您的明确表达 - 所以我必须在每次写入文件之前检查文件是否存在。那我有没有正确理解你? – user387184 2012-04-23 22:35:15

+0

@ user387184有时尝试Windows开发...并且您会喜欢* IX文件系统语义;-)无论如何,在写入之前不要检查。只有在开放(这是“内置”取决于模式)。如果有人取消链接文件(“删除它”),希望他们有一个理由......更好的方式来“清除”文件可能是截断它。 – 2012-04-23 22:37:54

+0

在这种情况下,我必须在每次写入之前检查文件是否仍然存在,因为它是一个带有许多输出的调试循环,并且用户可以在任何阶段重新开始,忘记所有以前的调试输出行 - 无论如何,它非常快速,根本没有问题。再次感谢让这个水晶般清晰!这就是我喜欢的原因! – user387184 2012-04-23 23:00:57

相关问题