如何运行可以在Java终端上运行的命令

如何运行可以在Java终端上运行的命令,java,cmd,exec,ag,Java,Cmd,Exec,Ag,伙计们,我想执行一个命令,你可以在我的Java程序中的cmd上执行。在做了一些研究之后,我想我找到了一种方法。但是,我的代码不起作用 我的代码是 import java.io.*; public class CmdTest { public static void main(String[] args) throws Exception { String[] command = {"ag","startTimes conf.js >> pro.txt"};

伙计们,我想执行一个命令,你可以在我的Java程序中的cmd上执行。在做了一些研究之后,我想我找到了一种方法。但是,我的代码不起作用

我的代码是

import java.io.*;

public class CmdTest {
    public static void main(String[] args) throws Exception {
        String[] command = {"ag","startTimes conf.js >> pro.txt"};
        ProcessBuilder builder = new ProcessBuilder(command);
        builder.directory(new File("./test-java/"));
        Process p = builder.start();
    }
}
程序执行,但不产生输出。我尝试使用其他命令,如“ls-a”,但仍然没有输出

有没有人能帮我调试一下,或者建议一个更好的方法?多谢各位

编辑1:我正在Mac上执行此操作。如果调试需要这样做

编辑2:通常的ls和其他命令正在使用你们提供的解决方案。但是,我想在Java程序中使用ag(the_silver_searcher)命令。当我尝试这样做时,我得到以下错误-

Exception in thread "main" java.io.IOException: Cannot run program "ag startTimes conf.js >> pro.txt": error=2, No such file or directory 

虽然有
ProcessBuilder
,但我一直使用
Runtime.getRuntime().exec(“cmd”)

它返回一个值,您可以从中获取


即使您使用
ProcessBuilder
,您仍然可以访问
进程.getStream()

您需要通过打开进程的输入流来读取进程的输出:

try (BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())) {
    System.out.println(reader.readLine()); // process the output stream somehow
}
此外,您还可以读取错误流(
p.getErrorStream()
),我经常在单独的流中执行此操作。在Java 8中,您可以使用
ProcessBuilder
上的
redirectErrorStream(true)
将错误流自动添加到输入流中。当然,您不能再区分输入来自哪个流,但它使阅读更容易。如果您不读取输入或错误流,并且进程的缓冲区变满,则进程往往会暂停,直到缓冲区中再次有足够的空间。

您还可以添加

builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);

在将输出重定向到控制台的start方法之前。

现有答案提供了有关如何用代码解决问题的信息,但没有给出代码无法工作的原因

//"ls" command runs under the "sh" on linux(cmd.exe on windows), so first arg is "sh"    
//second arg "-c" tells "sh" which exact command should be executed
//"ls" is actual command
//"startTimes" as I understand is a file or directory, it is arg for "ls" command
//"conf.js" is second arg for "ls" command
new ProcessBuilder("sh", "-c", "ls", "startTimes", "conf.js")
//set working dir for "sh" process"
            .directory(new File("./test-java/"))
//output will be written to "pro.txt" in working dir of "sh" process
            .redirectOutput(new File("./test-java/pro.txt"))
            .start();
当您在shell上执行一个程序时,在程序执行之前,shell会进行重要的处理。您的命令行

    String[] command = {"ag","startTimes conf.js >> pro.txt"};
    ProcessBuilder builder = new ProcessBuilder(command);
假设命令
ag
使用单个参数运行
startTimes conf.js>>pro.txt
——很可能不是您想要执行的操作。让我们更进一步:如果你写了

    String[] command = {"ag","startTimes", "conf.js", ">>", "pro.txt"};
    ProcessBuilder builder = new ProcessBuilder(command);
?

这将假定
ag
命令知道用于重定向其输出的
>
参数,这就是shell发挥作用的地方:
>
操作符是shell的一条指令,告诉它如何处理来自进程stdout的输出。当shell启动进程时,
ag
,它从来就不知道这个重定向,也根本不知道
和目标文件名


有了这些信息,只需使用其他答案中的代码示例。我不会将它们复制到我的文件中以获得正确的归属。

您是在Windows或Linux环境下运行此程序的吗?@AustinA,我是在MacHey ben上运行此程序的,当我使用ls等命令时,您的解决方案会起作用。但是当我使用ag命令时,我在线程“main”java.io.IOException:无法运行程序“ag startTimes conf.js>>pro.txt”中得到错误-异常:error=2,没有这样的文件或目录我现在能做什么?你在问一个新问题。接受提供给您的两个解决方案之一,并可能发布一个新的SO问题,这是公平的。我得到错误-“线程中的异常”main“java.io.IOException:无法运行程序“ag startTimes conf.js>>pro.txt”:错误=2,没有这样的文件或目录。你建议我怎么做?我得到错误-“线程中的异常”main“java.io.IOException:无法运行程序“ag startTimes conf.js>>pro.txt”:错误=2,没有这样的文件或目录。你建议我怎么做?@Sid尝试输入完整的文件路径,它可能正在运行本地目录的命令。请查看。不鼓励只使用代码的答案,因为它们没有解释如何解决问题中的问题。你应该更新你的答案来解释它的作用以及它是如何解决问题的。非常感谢你的Olaf,你的输入真的很有帮助。我终于解决了这个问题