【问题标题】:Having a hard time with linux command calls in Java with exec()使用 exec() 在 Java 中调用 linux 命令时遇到困难
【发布时间】:2021-12-16 15:00:33
【问题描述】:

我正在尝试使用 Runtime.getRuntime().exec() 来调用程序,就好像它是从终端调用的一样,但它在读取第一个文件后会因致命错误而崩溃。

在终端中我像这样运行命令:

ma​​ce4 -c -f inputFile.in > outputFile.out

它按预期工作,从第一个文件读取并在第二个文件中输出。

在 Java 中我尝试以这种方式运行它:

String args[] = new String[]{"mace4", "-c", "-f", inputFileName ,">",outputFileName};
        try {
            String s;
            Process proc = Runtime.getRuntime().exec(args, null, new File("/home/user/workDirectory/"));
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(proc.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println("line: " + s);
            proc.waitFor();
            proc.destroy();

程序一到达第一个文件的末尾,就会抛出这个:

致命错误:read_all_input,文件 > 未找到

该程序已经很老了,我似乎无法找到一种方法来从中获取更详细的错误..

我尝试用这些参数调用它 {"sh or bash", "-c", "mace4", "-c", "-f", inputFileName ,"> ",outputFileName} 使程序运行然后冻结(或至少控制台中没有出现).. 我是否调用了终端命令错误,如果是,我应该更改什么?

PS:这是我在这里的第一个问题,如果我错过了什么,我很抱歉..

【问题讨论】:

    标签: java linux bash exec system-calls


    【解决方案1】:

    您似乎正在尝试使用 Bash 输出重定向运算符 >。这会将您正在运行的程序的输出重定向到一个文件(或另一个程序)

    This answer 解释了如何使用 ProcessBuilder 执行此操作,它应该适用于您在此处尝试执行的操作。

    例如:

    ProcessBuilder pb = new ProcessBuilder("mace4", "-c", "-f", inputFileName);
    pb.redirectOutput(new File(outputFileName));
    Process p = pb.start();
    

    【讨论】:

    • 非常感谢,成功了!我将开始研究 ProcessBuilder。
    • 我希望我也可以投票给你,但我没有足够的代表:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多