Мои догадки были неверны и не имели ничего общего с ответом. Этот вопрос больше не действителен. См. мой ответ . Извините за этот плохой вопрос.
Tl; dr Версия
Почему процесс Java не может найти определенный файл, пока другой процесс - процесс, который создал этот файл - не завершил выполнение. Можно ли обойти это?
Более длинная версия
У меня есть приложение, которое должно перезапустить себя (просто нужно, хорошо?). В первый раз он создает файл, а затем сериализует объект там. Это делается с помощью FileOutputStream
/ ObjectOutputStream
, как описано ниже:
private static File serializeBootstrapInfoIntoFile(
final BootstrapInfo info) throws IOException {
final File tempFile = File.createTempFile("BobBootstrapInfo", null);
final FileOutputStream fos = new FileOutputStream(tempFile);
final ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(info);
// just being thorough
oos.flush();
oos.close();
fos.flush();
fos.close();
return tempFile;
}
После этого я создаю другой процесс Java с System.exec()
-call, которому я передаю абсолютный путь возвращаемого tempFile
в качестве системного свойства. Затем другой процесс Java должен открыть файл и десериализовать содержащий объект. Первый процесс остается активным до завершения порожденного процесса, поскольку он обрабатывает потоки вывода / ошибок нового.
Проблема, однако, в том, что второй процесс, похоже, не находит файл и всегда умирает в FileNotFoundException
во время десериализации (я подтвердил это file.exists()
).
Когда я проверяю вручную, файл действительно существует. Кроме того, если я вручную запускаю ту же самую командную строку, которая передается в System.exec()
, она работает нормально. Итак, я предполагаю, что первый процесс каким-то образом умудряется скрыть файл от нового процесса или не может фактически записать файл в файловую систему, даже потоки сбрасываются и закрываются. Я также попытался с помощью Thread.sleep(10000)
в первом потоке, чтобы завершить операции ввода-вывода, но это не помогло.
Я что-то не так делаю? Или это Java, или OSX (я использую atm)?
Ответы на комментарии
Я использую OS X 10.6.3, а версия Java - 1.6.0_20.
Аргументы System.exec()
:
java
-classpath
/var/folders/dr/drDlHsguGvq0zF2Jtgn4S++++TI/-Tmp-/bob7168396245507677201.tmp:/Users/wolfie/Documents/workspace/Bob/dist/lib/junit.jar:/Users/wolfie/Documents/workspace/Bob/dist/lib/bob.jar
-Dcache.location="/var/folders/dr/drDlHsguGvq0zF2Jtgn4S++++TI/-Tmp-/BobBootstrapInfo4944987280015634213.tmp"
com.github.wolfie.bob.Bob
где каждая строка является элементом в массиве String. Файл /var/folders/dr/drDlHsguGvq0zF2Jtgn4S++++TI/-Tmp-/BobBootstrapInfo4606780571989099166.tmp
- это тот, который был создан и читается другим потоком. Аргументы envp
и dir
равны null
.
Общая трассировка стека:
Exception in thread "main" com.github.wolfie.bob.BootstrapError: java.io.FileNotFoundException: "/var/folders/dr/drDlHsguGvq0zF2Jtgn4S++++TI/-Tmp-/BobBootstrapInfo4606780571989099166.tmp" (No such file or directory)
at com.github.wolfie.bob.Bob.getBootstrapInfo(Bob.java:186)
at com.github.wolfie.bob.Bob.run(Bob.java:138)
at com.github.wolfie.bob.Bob.main(Bob.java:95)
Caused by: java.io.FileNotFoundException: "/var/folders/dr/drDlHsguGvq0zF2Jtgn4S++++TI/-Tmp-/BobBootstrapInfo4606780571989099166.tmp" (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:106)
at com.github.wolfie.bob.Bob.deserializeBootstrapInfoFromFile(Bob.java:265)
at com.github.wolfie.bob.Bob.getBootstrapInfo(Bob.java:184)
... 2 more