是否可以从java更改CMD目录?如果是这样,怎么样? (如CMD中的“CD”)

时间:2012-08-14 11:52:41

标签: java directory cmd

我制作了2个.java文件和1个.bat文件。让我们将第一个.java文件称为“First.java”,将第二个称为“Second.java”。批处理文件是“compile.bat”。让我们说First.java位于“... / Desktop / temp / First.java”,而Second.java位于“... / Desktop / Test / 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");

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

2 个答案:

答案 0 :(得分: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.Process中

     

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

     

默认情况下,创建的子进程没有自己的终端或   安慰。所有标准I / O(即stdin,stdout,stderr)操作   将被重定向到父进程,在那里可以访问它们   通过使用方法getOutputStream()获得的流,   getInputStream()和getErrorStream()。父进程使用这些   stream将输入提供给子进程并从子进程获取输出。因为   某些本机平台仅为标准提供有限的缓冲区大小   输入和输出流,无法及时写入输入流   或者读取子进程的输出流可能会导致子进程   阻止,甚至死锁。

     

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

     

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

     

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

     

从1.5开始,ProcessBuilder.start()是创建一个的首选方法   过程

     

自:JDK1.0

答案 1 :(得分:1)

如果这是来自Java的直接引用,那么你最后会丢失分号,字符串中的必要转义字符以及cmd命令向Windows指示它需要cmd.exe来启动它:

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

您也可以在cmd之后添加/ c以在完成后立即关闭该进程,并且/或者开始指示它应该在另一个窗口中启动。