gpt4 book ai didi

Java getRuntime 执行

转载 作者:行者123 更新时间:2023-11-29 05:10:16 26 4
gpt4 key购买 nike

我在 Java 1.8 上调用 p = Runtime.getRuntime().exec(command)。该命令调用 bash 脚本如下:

#!/bin/bash
args=("$@")
cat /home/user/Downloads/bigtext.txt | grep ${args[0]}

当使用命令行调用时,上面的 bash 脚本工作正常。在我的 Java 应用程序中使用 exec() 调用时,我没有返回任何 CAT 输出。它似乎没有通过 p.waitFor();我哪里错了?

如果我直接运行诸如“ls -alF”之类的命令,一切都会按预期进行。

$ java -version java version "1.8.0_31" Java(TM) SE Runtime Environment (build 1.8.0_31-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)


String tmp = "/home/user/search "+input;
System.out.println(tmp); // /home/user/search sometextarg
String woa = executeCommand(tmp);


private String executeCommand(String command) {
StringBuilder output = new StringBuilder();
BufferedReader reader = null;
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();

reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = "";

while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}

} catch (Exception e) {
e.printStackTrace();
}

return output.toString();
}

最佳答案

你的 Java 进程和你的脚本死锁了,互相等待:你在等待进程退出,进程在等待你读取输出。

它恰好适用于 ls -alF 和其他具有小输出的命令,因为它们都适合管道的缓冲区(在我的系统上为 64kib)。

只需将 p.waitFor() 移到 while 循环下方,您就会有更多的运气:

private String executeCommand(String command) {     
StringBuilder output = new StringBuilder();
BufferedReader reader = null;
Process p;
try {
p = Runtime.getRuntime().exec(command);
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
p.waitFor();

} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}

如果您还希望它能正确处理包含空格和某些其他字符的值,您必须:

  1. 在您的脚本中引用 "${args[0]}"
  2. 重写您的 executeCommand 以使用 Runtime.exec(String[]) 而不是 Runtime.exec(String)

关于Java getRuntime 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28839170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com