从Java执行外部程序

Sau*_*ani 7 java macos terminal

我正在尝试从Java代码执行程序.这是我的代码:

public static void main(String argv[]) {
    try {
      String line;
      Process p = Runtime.getRuntime().exec(
          "/bin/bash -c ls > OutputFileNames.txt");
      BufferedReader input = new BufferedReader(
          new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
        System.out.println(line);
      }
      input.close();
    } catch (Exception err) {
      err.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的操作系统是Mac OS X 10.6.

如果我"> OutputFileNames.txt"getRuntime().exec()方法中删除,所有文件名都打印在控制台上就好了.但我需要将它打印到文件中.

另外,如果我将命令更改为:

Process p = Runtime.getRuntime().exec(
    "cmd \c dir > OutputFileNames.txt"); 
Run Code Online (Sandbox Code Playgroud)

并在Windows上运行它,它运行并在文件中完全打印结果.

我已经阅读了其他从Java执行另一个应用程序的帖子,但似乎没有与我的问题有关.

我真的很感激我能得到的任何帮助.

谢谢,

Ste*_*n C 8

要使重定向按写入方式工作,您需要执行以下操作:

Process p = Runtime.getRuntime().exec(
      new String[]{"/bin/bash", "-c", "ls > OutputFileNames.txt"});
Run Code Online (Sandbox Code Playgroud)

您遇到的问题是Runtime.exec(String)将命令行拆分为参数的简单方法.

如果您在shell提示符下运行该命令(按原样),则必须将其输入为:

$ /bin/bash -c "ls > OutputFileNames.txt"
Run Code Online (Sandbox Code Playgroud)

因为"bash"的"-c"选项要求将生成的shell的命令行作为单个shell参数.但是如果你将裸引号放入Java String中,那么该Runtime.exec(String)方法仍然会出错.唯一的解决方案是将命令参数作为数组提供.