从 java 调用 shell 命令的通常方法是这样的:
Process process = Runtime.getRuntime().exec(command);
并且通常工作正常。 但现在我已将项目导出到可执行 jar 文件,并且 callig shell 命令不再起作用。此问题有任何解释、解决方案或解决方法吗?
菲尼亚斯
--
编辑:
甚至无法识别键盘中断(ctrl+c;ctrl+d)。
杀死java后终端输入将不起作用
--
最小的程序:
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class Test {
public static String fileName = "";
/** test if you can open a 7z archive file with a given password */
public static boolean test(String password)
throws IOException, InterruptedException {
String command = "7z l "+fileName;
Process process = Runtime.getRuntime().exec(command);
OutputStream out = process.getOutputStream();
OutputStreamWriter w = new OutputStreamWriter(out);
BufferedWriter writer = new BufferedWriter(w);
writer.write(password+"\n");
writer.close();
w.close();
out.close();
if(process.waitFor() == 0) {
return true;
}
else {
return false;
}
}
public static void main(String[] args) throws IOException, InterruptedException {
fileName = args[0];
test(args[1]);
}
}
最佳答案
如果您运行测试程序并使用 ps
或任务管理器,您会注意到 7z
正在运行。您的问题是您没有消耗流程的输出。因此,7z
试图输出存档内容时很快就会被阻止。
如果您在 process.waitFor()
之前添加以下几行,您将获得一个工作程序:
InputStream in = process.getInputStream();
byte[] buf = new byte[256];
while (true) {
int c = in.read(buf);
if (c == -1)
break;
System.out.println(new String(buf));
}
但是,这只会消耗进程标准输出,您需要使用 process.getErrorStream()
执行相同的操作。您可能会发现使用 ProcessBuilder 来启动进程更容易,因为它允许您合并 stderr 和 stdout 流。
关于java - 从 jar 运行 shell 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4620812/