从java运行一个.exe文件并继续运行

问题描述:

我想以编程方式运行.exe程序(如果它尚未运行)。 目前我使用进程生成器从java启动.bat。批处理文件在检查它是否正在运行后运行.exe。 问题是,java将不会继续,直到用户关闭.exe程序。我该如何解决这个问题?从java运行一个.exe文件并继续运行

Java代码:

try { 
     ProcessBuilder builder = new ProcessBuilder("open.bat"); 
     final Process process = builder.start(); 
     InputStream is = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     while ((br.readLine()) != null) { 
     } 
     System.out.println("command line terminated"); 
    } catch (Exception err) { 
     err.printStackTrace(); 
     System.out.println("error "); 
    } 

批号:(open.bat)

tasklist | find "illustrator.exe" 
if errorlevel 1 start "" "C:\Program Files (x86)\Adobe\Adobe Illustrator CS6\Support Files\Contents\Windows\illustrator.exe" 
+0

创建一个新的主题? – 2014-11-07 00:30:11

+1

将'while((br.readLine())!= null){'移动到另一个线程,让它静静地消耗结果,这将允许剩下的代码,记住,IO往往是阻塞的,所以循环;) – MadProgrammer 2014-11-07 00:30:27

+1

你得到“命令行终止”的输出吗?破坏你的进程 – 2014-11-07 00:34:19

更新

使用...

start "" "C:\Program Files (x86)\Adobe\Adobe Illustrator CS4\Support Files\Contents\Windows\illustrator.exe" 

由于open.bat批处理文件,并使用...

try { 
    ProcessBuilder builder = new ProcessBuilder("open.bat"); 
    builder.redirectError(); 
    builder.inheritIO(); 
    final Process process = builder.start(); 
    final InputStream is = process.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 
    String text = null; 
    while ((text = br.readLine()) != null) { 
     System.out.println(text); 
    } 

    System.out.println("command line terminated"); 
    System.out.println("Exited with " + process.waitFor()); 
} catch (Exception err) { 
    err.printStackTrace(); 
    System.out.println("error "); 
} 

我可以得到批处理文件来运行和终止,仍然有插图的负载和运行。

主要增加的是呼叫ProcessBuilder#inheritIO,这确实有些神奇,我不知道,但似乎让批处理文件终止......

JavaDocs

这给出的行为与大多数操作系统命令解释程序或标准C库函数system()相当。

+0

好极了!有用。感谢MadProgrammer并感谢大家。 – Audrey 2014-11-07 01:25:24

+0

@Audrey是的,这是一个有趣的过山车骑“我不知道为什么这个作品,但它确实,所以不要想太久或它可能会停止”... ...同样旧的,同样的旧办公室比;) – MadProgrammer 2014-11-07 01:27:53

+0

从API: pb.inheritIO() 的行为完全相同的方式调用 pb.redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(重定向.INHERIT) – Audrey 2014-11-07 01:30:05