2

我制作了 2 个 .java 文件和 1 个 .bat 文件。让我们将第一个 .java 文件称为“First.java”,将第二个称为“Second.java”。批处理文件是“compile.bat”。假设 First.java 位于“.../Desktop/temp/First.java”中,而 Second.java 与批处理文件(“.. ./Desktop/Test/compile.bat")。现在,compile.bat 包含以下代码:

cmd /c "cd C:\blahblah\temp && javac First.java"

我在 CMD 和双击中都对其进行了测试,它可以工作。我想使用以下代码从 Second.java 编译 First.java:

Process p1 = Runtime.getRuntime().exec("C:\\blahblah\\compile.bat");

(我必须导航到目录,因为 CMD 的默认目录与 compile.bat 的目录不同)。这行不通。似乎它只是忽略了代码。正如我所说,我尝试了很多不同的东西,我什至尝试使用其他一些应该改变目录的库。请帮帮我!

4

2 回答 2

2

最简单的方法:你应该使用start. 也可以设置工作目录,看这个例子:

Runtime r=Runtime.getRuntime();
    r.exec("cmd.exe /c start compile.bat",         //path to executable
            null,                                  // env vars, null means pass parent env
            new File("C:\\blahblah"));              // working directory 

附加信息:如果您不想在它的单独控制台中启动您的进程(这就是start您可以做的)r.exec("cmd.exe /c compile.bat");,但因为它在其父控制台的上下文中执行,您必须等待p.waitFor()或读取它的输入流 - 否则它可能会静默失败。这将运行并显示您的命令的输出:

Process p=r.exec("cmd.exe /c compile.bat",         //path to executable
            null,                                  // env vars, null means pass parent env
            new File("C:\\blahblah"));

    InputStream is=p.getInputStream();
    BufferedReader br= new BufferedReader(new InputStreamReader(is));

    String line=new String();
    while ((line=br.readLine())!=null) System.out.println (line);

同样从 1.5 开始, ProcessBuilder 是启动进程的首选方式(来自 Java doc):

java.lang.进程

创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程、守护进程、Microsoft Windows 上的 Win16/DOS 进程或 shell 脚本。

默认情况下,创建的子进程没有自己的终端或控制台。它的所有标准I/O(即stdin、stdout、stderr)操作都将被重定向到父进程,在那里可以通过使用getOutputStream()、getInputStream() 和getErrorStream() 方法获得的流来访问它们。父进程使用这些流向子进程提供输入并从子进程获取输出。由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

如果需要,也可以使用 ProcessBuilder 类的方法重定向子进程 I/O。

当没有更多对 Process 对象的引用时,子进程不会被终止,而是子进程继续异步执行。

不要求由 Process 对象表示的进程相对于拥有该 Process 对象的 Java 进程异步或并发执行。

从 1.5 开始,ProcessBuilder.start() 是创建流程的首选方式。

自:JDK1.0

于 2012-08-14T12:39:40.743 回答
1

如果这是来自 Java 的直接引用,那么您将缺少末尾的分号、字符串中必要的转义字符以及 cmd 命令以向 Windows 指示它需要 cmd.exe 才能启动它:

Process p1 = Runtime.getRuntime().exec("cmd C:\\blahblah\\compile.bat");

您还可以在 cmd 之后添加 /c 以在进程完成后立即关闭进程,和/或 start 指示它应该在另一个窗口中启动。

于 2012-08-14T12:03:23.373 回答