代码之家  ›  专栏  ›  技术社区  ›  Henrik Paul

基于进程分叉的Java文件管理

  •  1
  • Henrik Paul  · 技术社区  · 16 年前

    我的猜测是错误的,与答案无关。这个问题不再有效。看到了吗 my answer . 对不起,这个问题问得不好。

    加长版

    我有一个应用程序需要重新启动自己(它只是需要,好吗?)。第一次,它创建一个文件,然后在那里序列化一个对象。这是通过一个 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;
    }
    

    System.exec() tempFile 作为系统属性。另一个java进程应该打开该文件,并反序列化包含的对象。第一个进程在派生的进程退出之前保持活动状态,因为它处理新进程的输出/错误流。

    FileNotFoundException 在反序列化过程中(我已经用 file.exists()

    当我事后手动检查时,文件确实存在。另外,如果手动运行传递给 System.exec() ,运行良好。因此,我猜第一个进程设法对新进程隐藏了文件,或者没有将文件真正写入文件系统,甚至流也被刷新和关闭。我也试过了 Thread.sleep(10000)

    我做错什么了吗?或者这是Java的东西,或者OSX的东西(我用atm运行)?

    对评论的答复

    我运行的是OSX10.6.3,Java版本是1.6.0\u20。

    这个

    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
    

    其中每一行都是字符串数组中的一个元素。这个 /var/folders/dr/drDlHsguGvq0zF2Jtgn4S++++TI/-Tmp-/BobBootstrapInfo4606780571989099166.tmp -文件是一个被创建的,并且被另一个线程读取的文件。这个 envp dir 论点是 null .

    整个stacktrace是:

    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 回复  |  直到 9 年前
        1
  •  0
  •   Henrik Paul    16 年前

    问题的答案是看不见的:我这样定义了系统属性:

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

    但财产应该是

    -Dcache.location=/foo/file.ext

    i、 e.没有引号。显然,当从命令行传递完全相同的参数时,这一点被忽略了,可能是因为Bash以不同的方式将它们处理到JVM。

    很抱歉问了这个可怜的问题。