Управление файлами Java при разветвлении процессов - PullRequest
1 голос
/ 27 июня 2010

Мои догадки были неверны и не имели ничего общего с ответом. Этот вопрос больше не действителен. См. мой ответ . Извините за этот плохой вопрос.

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

1 Ответ

0 голосов
/ 27 июня 2010

Ответ не виден из вопроса: я определил системное свойство следующим образом:

-Dcache.location="/foo/file.ext"

Но свойство должно было быть вместо

-Dcache.location=/foo/file.ext

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

Извините за плохой вопрос.

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