当前位置: 首页 > 知识库问答 >
问题:

Java程序无法从终端获得输出

陈法
2023-03-14

我正在从终端运行我的Java程序,我试图使用我的代码中的linux命令来计算某个目录中的文件数量;我已经设法获得了除此之外的所有其他命令的输出。

我的命令是:ls somePath/*。xml | wc-l

当我在代码中运行命令时,它似乎没有任何输出,但当我在终端中运行相同的命令时,它工作正常,并实际输出该目录中的xml文件数。

这是我的代码:

private String executeTerminalCommand(String command) {
    String s, lastOutput = "";
    Process p;
    try {
        p = Runtime.getRuntime().exec(command);
        BufferedReader br = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
        System.out.println("Executing command: " + command);
        while ((s = br.readLine()) != null){//it appears that it never enters this loop since I never see anything outputted 
            System.out.println(s);
            lastOutput = s;
        }
        p.waitFor();
        p.destroy();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return lastOutput;//returns empty string ""
}

更新代码,带输出

private String executeTerminalCommand(String command) {
        String s, lastOutput = "";
        try {
            Process p = new ProcessBuilder().command("/bin/bash", "-c", command).inheritIO().start();           
            //Process p = Runtime.getRuntime().exec(command);
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));
            System.out.println("Executing command: " + command);
            while ((s = br.readLine()) != null){
                System.out.println("OUTPUT: " + s);
                lastOutput = s;
            }
            System.out.println("Done with command------------------------");
            p.waitFor();
            p.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("LAST OUTPUT IS: " + lastOutput);
        return lastOutput;
    }

输出:

Executing command: find my/path -empty -type f | wc -l
Done with command------------------------
1
LAST OUTPUT IS:

共有1个答案

端木夕
2023-03-14

要执行管道,必须调用一个shell,然后在该shell中运行命令。

Process p = new ProcessBuilder().command("bash", "-c", command).start();

bash调用shell来执行命令,-c表示从字符串中读取命令。因此,您不必在ProcessBuilder中以数组的形式发送命令。

但是如果你想使用运行时,那么

String[] cmd = {"bash" , "-c" , command};
Process p = Runtime.getRuntime().exec(cmd);

注意:您可以在这里查看ProcessBuilder的优点,以及Runtime

 类似资料:
  • 问题内容: 我有一个程序可以执行为 这将安装一堆东西,并且屏幕上发生了很多活动。 现在,我正在尝试通过执行 希望所有发生在屏幕上的活动都被捕获在(或)中。但是,在进程运行时,内容直接打印到终端,而不会捕获到或中,在进程运行后,它们都为空。 这里会发生什么?如何捕获此内容? 问题答案: 通常,您所做的已经足以将所有输出传递到变量。 一个例外是,如果您正在运行的程序用于直接连接到其控制终端,并通过该终

  • 问题内容: 我对如何从ssh等终端子进程发送输入和接收输出有疑问。 我在Golang中找不到一个简单的示例,其工作原理与上述类似。 在Golang中,我想做这样的事情,但是似乎不起作用: 然而; 我不确定如何执行此操作,因为每次执行此ssh命令时,我只能获取输出。我无法通过代码自动输入密码。有没有人写过ssh等终端进程的示例?如果是这样,请分享。 问题答案: 由于上面的评论,我可以使用密码使用ss

  • 我试图创建一个程序,在这个程序中我可以接受输入,并用servlet获得一个数字的平方根。我是初学者,所以知道的不多。问题是当我尝试我的代码时,它不起作用。代码如下: myservletdemo.java 结果是:首先,当你点击链接时,你会得到: 这个结果

  • 问题内容: 我有兴趣清除由printf语句生成的C程序的输出,该语句长多行。 我最初的猜测是使用 但这产生了 我希望它会产生 有谁知道如何获得后者的结果? 问题答案: 如果您还记得同时删除了控制字符,则可以在端子和管道上获得理想的结果。这是硬编码的两行。

  • 问题内容: 我见过的大多数代码示例都试图从stdin读取而没有本地回显。为此,他们修改了“本地模式”标志以删除“回声输入字符”的设置。我想我可能只是修改“输入模式”标志,这是“插入输入队列给定的字节。” 。但是,即使我以root身份运行脚本,也没有任何效果。我写给fd的所有内容似乎都去了终端输出,而不是终端输入。基本上,我想做的就是这个确切的事情,但是在纯python中。 问题答案: 是一个ioc

  • 我正在制作一个基本计时器,这是我的第一个项目之一,当你按下一个按钮时,代码应该创建3个不同的变量,从它们各自的输入中获取值,这3个变量代表小时、分钟和秒。 发生的事情是,如果你安慰。记录由于某种原因未定义的这3个变量中的任何一个,如果没有这些值,整个倒计时将无法工作。 输入被设置为在html中的value=0开始,所以它应该至少返回0,而不是未定义 下面是javascript代码: 我看到了其他解