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

时间:2017-10-08 20:52:42

标签: java runtime

我想从我的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()没有等待,因为它应该

即使外部app weasis仍然打开,过程p也会完成

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

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

1 个答案:

答案 0 :(得分:0)

您好,您可以等待完成流程的输出,如下所示:

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