我正在啓動第三方應用如何檢查在Java中
Desktop dsktp=Desktop.getDesktop();
dsktp.open(new File("C:\\abcd.exe"));
它是成功啓動程序的Java程序使用桌面運行進程的狀態。 現在我只想在這個過程完成(或關閉或強制終止)時啓用下一個按鈕。 如果此過程已結束或沒有結束,我該如何獲得狀態?
我正在啓動第三方應用如何檢查在Java中
Desktop dsktp=Desktop.getDesktop();
dsktp.open(new File("C:\\abcd.exe"));
它是成功啓動程序的Java程序使用桌面運行進程的狀態。 現在我只想在這個過程完成(或關閉或強制終止)時啓用下一個按鈕。 如果此過程已結束或沒有結束,我該如何獲得狀態?
我會用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
只應被觸發。
所以最好使用Process
和ProcessBuilder
:
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();
某些程序,取決於它們是如何建立
更好地使用從Java的進程 – azro
沒有找到任何方法來做這個方法... 進程要求「程序通過哪個文件打開」,「文件路徑」作爲參數 –
你不能,桌面沒有提供任何連接正在運行的進程的手段。如前所述,最好使用'Process',最好使用'ProcessBuilder' - 提供大量示例 – MadProgrammer