Java捕获终端输出

时间:2016-06-01 11:05:41

标签: java terminal base64

我目前正在尝试在linux shell中为de / encoding base64编写一个Java文件。我到目前为止的方法是:

public static String cmdExec(String Base64String) throws java.io.IOException, java.lang.InterruptedException{
    String line;

    try {
        Process p = Runtime.getRuntime().exec("openssl enc -base64 -d <<< " + Base64String);
        BufferedReader input = new BufferedReader
            (new InputStreamReader(p.getInputStream()));
             while ((line = input.readLine()) != null) {
            output += (line);
        }
        input.close();
        }
    catch (Exception ex) {
        ex.printStackTrace();
    }
    System.out.println(output);
    return output;
}

不幸的是,我没有得到输出,尽管如果我手动将它输入shell中,该命令仍然有效 我知道自Java 8以来还有Java编码器以及apache解决方案,但我真的很想通过命令行来实现它。

我有什么不对的吗?

2 个答案:

答案 0 :(得分:1)

它不起作用,因为子进程没有在shell中运行,因此尝试重定向被视为openssl的参数。因此openssl抱怨<<<是无效选项。你可以通过p.getErrorStream()以与stdout相同的方式捕获和打印孩子的标准错误来看到这一点。此外,子进程的退出值可以p.exitValue()使用 - 您也应该检查它。

现在,Base64String参数是您要解码的base64编码文本,因此您需要将该文本作为输入发送给子项。您可以使用p.getOuputStream()获取子项的stdin,然后写入流:

Process p = Runtime.getRuntime().exec("openssl enc -base64 -d");
// Process p = Runtime.getRuntime().exec("base64 -d");    // the base64 command also works
BufferedWriter toChild = new BufferedWriter(
                             new OutputStreamWriter(p.getOutputStream()));
toChild.write(Base64String + "\n");
toChild.close();

关闭孩子的stdin后,您可以像现在一样使用p.getInputStream()读取解码后的输出。如上所述,您应检查子项的退出值(非零表示子项中发生错误),并收集子项的stderr,以便在退出值为非零时显示该项。

最后一点,命令base64 -d也可以工作,通常作为核心linux实用程序出现,并且不需要安装openssl

答案 1 :(得分:-1)

也许可以尝试Scanner

String output = "";
Process p = Runtime.getRuntime().exec("openssl enc -base64 -d <<< "+cmdLine);
Scanner s = new Scanner(p.getInputStream()).useDelimiter("\\A");
while (s.hasNext()) {
  output += s.next();
}
s.close();