我有一些类似下面的代码,我在Eclipse中的调试器中运行:
FileOutputStream fstream = new FileOutputStream(new File("foo"));
byte[] ba = someBytes();
fstream.write(bytes);
// tried with and without the following two lines. no difference
// fstream.flush();
// fstream.getFD().sync();
fstream.close();
当我在Eclipse调试器中单步执行此代码时,文件在调用fstream.close()
之后不存在(通过file.exists()
从使用相同路径创建的另一个File对象进行验证,以及查找对于bash shell中的文件。)
我认为这是某种竞争条件,但我无法找到正在发生的事情。我尝试根据另一个StackOverflow问题添加fstream.flush()
和fstream.getFD().sync()
,但这没有帮助。
这种情况的最终症状是某些测试用例在一定程度上无法确定性地失败。对于连续相同的运行,无论是调试还是不运行,行为都是相同的,但如果我在调试器中更改了断点,则行为可能会发生变化。我相信它通常/总是在我在调试器之外运行代码时工作,但令人不安的是,相同的代码可能在调试器内部失败。
这里可能发生什么?有没有一种方法可以确保文件在我认为是时写入?
**更新:我想出了一些正在发生的事情。以下hack强制写入文件:
fstream.close();
fstream = new FileOutputStream(file, true);
这是一个黑客,但似乎迫使操作系统完成其写作。
答案 0 :(得分:0)
这似乎是Eclipse调试器的一个问题。我在编辑中提到的黑客是我发现强迫预期行为的唯一方法。