我目前正在尝试在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解决方案,但我真的很想通过命令行来实现它。
我有什么不对的吗?
答案 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();