2017-09-10 202 views
0

我正在啓動第三方應用如何檢查在Java中

Desktop dsktp=Desktop.getDesktop(); 
dsktp.open(new File("C:\\abcd.exe")); 

它是成功啓動程序的Java程序使用桌面運行進程的狀態。 現在我只想在這個過程完成(或關閉或強制終止)時啓用下一個按鈕。 如果此過程已結束或沒有結束,我該如何獲得狀態?

+1

更好地使用從Java的進程 – azro

+0

沒有找到任何方法來做這個方法... 進程要求「程序通過哪個文件打開」,「文件路徑」作爲參數 –

+0

你不能,桌面沒有提供任何連接正在運行的進程的手段。如前所述,最好使用'Process',最好使用'ProcessBuilder' - 提供大量示例 – MadProgrammer

回答

0

我會用ProcessBuilder代替並採取基於Interface的方法。這將是漫長的;但它應該可以幫助你理解這個問題應該被解決的方式。

讓我們來定義界面一線

public interface ProcessEventListener { 
    public void onComplete(Process process); 
} 

現在對於更好的模塊讓我們創建一個ProcessManager講座

public class ProcessManager extends Thread { 
    private ProcessBuilder processBuilder; 
    private Process process; 
    private List<ProcessEventListener> processEventListeners = new ArrayList<ProcessEventListener>(); 

    public ProcessManager(String externalProcessPath, List<String> args) { 
     args.add(0, externalProcessPath); 
     processBuilder = new ProcessBuilder(args); 
    } 

    public ProcessManager(String externalProcessPath) { 
     processBuilder = new ProcessBuilder(externalProcessPath); 
    } 

    public Process getProcess() { 
     return process; 
    } 

    public void run() { 
     try { 
      process = processBuilder.start(); 
      // wait until the process is completed 
      process.waitFor(); 
      // let the listeners know since the process is completed 
      for (ProcessEventListener listener : processEventListeners) { 
       listener.onComplete(process); 
      } 
     } catch (InterruptedException e) {} 
    } 

    public void addProcessEventListener(ProcessEventListener processEventListener) { 
     processEventListeners.add(processEventListener); 
    } 

    public void removeAllListeners() { 
     processEventListeners.clear(); 
    } 
} 

讓我們定義一個類,將實現界面 -

public class NextActionInitiator implements ProcessEventListener { 
    public void onComplete(Process process) { 
     // your workflow for next button action or enabling the button or 
     // whatever; should go here. 
    } 
} 

一起使用所有這些很簡單。一旦完成該處理

// provide the process manager an absolute path of your executable; you 
// can also pass arguments as an ArrayList as second parameter. 
// ...new ProcessManager("\absolute\path\of\your\exe", argList); 
ProcessManager pManager = new ProcessManager("\absolute\path\of\your\exe"); 
NextActionInitiator nextActionInitiator = new NextActionInitiator(); 
pManager.addProcessEventListener(nextActionInitiator); 
pManager.start(); 

NextActionInitiator所述的方法onComplete只應被觸發。

0

所以最好使用ProcessProcessBuilder

String[] args = {"C:\\abcd.exe"}; 
try { 
    ProcessBuilder pb = new ProcessBuilder(args); 
    pb = pb.redirectErrorStream(true);    // put error out with normal out 

    Process p = pb.start();  
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    String str; 
    while ((str= br.readLine()) != null) { 
     System.out.println(str); 
    } 
}catch (IOException e) { 
    e.printStackTrace(); 
} 

對於你需要開始後添加p.waitFor();某些程序,取決於它們是如何建立