Есть ли способ заставить файл быть написанным на Java, чтобы после того, как функция вернулась, файл гарантированно был записан? - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть некоторый код, подобный следующему, который я запускаю в отладчике в 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);

Это взлом, но, похоже, заставляет ОС завершить запись.

1 Ответ

0 голосов
/ 19 февраля 2011

Это, похоже, проблема с отладчиком Eclipse.Взлом, который я упомянул в своем редактировании, - единственный способ заставить ожидаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...