У меня есть некоторый код, подобный следующему, который я запускаю в отладчике в 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).
Я предполагаю, что это какое-то состояние гонки, но яне смог найти, что происходит.Я пытался добавить fstream.flush()
и fstream.getFD().sync()
для другого вопроса StackOverflow, но это не помогло.
Конечный симптом этого состоит в том, что некоторые тестовые примеры терпят неудачу несколько недетерминированно.Поведение выглядит одинаково для последовательных идентичных прогонов, либо с отладкой, либо без, но если я изменю точки останова в отладчике, поведение может измениться.Я полагаю, что обычно / всегда работает, когда я запускаю код вне отладчика, но беспокоит то, что тот же самый код может потерпеть неудачу внутри отладчика.
Что здесь может происходить?Есть ли хороший способ убедиться, что файл записан, когда я думаю, что это так?
** ОБНОВЛЕНИЕ: Я понял кое-что из того, что происходит.Следующий взлом заставляет файл быть записанным:
fstream.close();
fstream = new FileOutputStream(file, true);
Это взлом, но, похоже, заставляет ОС завершить запись.