我怎样才能等到外部应用程序被手动关闭?

How can I wait until external application is manually closed?

我想从我的 java 代码打开一个外部应用程序,等到用户关闭外部应用程序,然后继续我的代码。

为了理解我的问题,我想用一个名为 weasis 的外部应用程序打开医学图像,然后当用户关闭 weasis 时,代码将继续并删除图像文件以保护患者的隐私

这是我的代码:

public static void openDicomWeasis (){
    File folder = new File(OutPutResultFolder);
    File[] listOfFiles = folder.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
            File fichierSource = new File(listOfFiles[i].getAbsolutePath());
            String fichier="C:\weasis\"+listOfFiles[i].getName()+".dcm";
            String file=listOfFiles[i].getName()+".dcm";
            File fichierDest= new File(fichier);
            copier(fichierSource,fichierDest);

            Runtime runtime = Runtime.getRuntime();

            try { 
                String query="C:\Users\salhi\Desktop\projet ath\dicom viewer\weasis\weasis-win32.exe \"$dicom:get -l \'"+fichier+"\'\"";
                final Process p = runtime.exec(query);
                int exit= p.waitFor();
            } catch (IOException ex) {
                Logger.getLogger(ConnexionPostgres_Retour.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {
                Logger.getLogger(RadioApp.class.getName()).log(Level.SEVERE, null, ex);
            }
            delete();
        }
    }
}

这是我的删除方法

public static void delete(){
    File fichier =new File("C:\weasis");
    try {
        FileUtils.cleanDirectory(fichier);
    } catch (IOException ex) {
        Logger.getLogger(RadioApp.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我的问题是方法 waitFor() 没有像我预期的那样等待

即使外部应用程序 weasis 仍处于打开状态,进程 p 也已完成

我的解释是进程 p 完成了它的工作,即打开 weasis 然后结束,此时进程 p 没有链接到外部应用程序。进程 p 看不到 weasis 仍然打开,这就是为什么 waitFor() 方法没有按预期等待。

如何命令 java 等到用户手动关闭外部应用程序然后继续并删除医疗文件?

您好,您可以像这样等待过程的输出完成:

BufferedReader stdOut=new BufferedReader(new InputStreamReader(p.getInputStream()));
    String s;
        while((s=stdOut.readLine())!=null){
          //nothing or print
        }