gpt4 book ai didi

java.lang.运行时异常 "Cannot run program"

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:55 25 4
gpt4 key购买 nike

我收到类似java.io.IOException: Cannot run program cat/home/talha/* | 的异常grep -c TEXT_TO_SEARCH": error=2, No such file or directory while executing the command below 尽管当我通过终端执行相同的命令时没有问题。我需要执行并返回以下命令的输出:

cat /home/talha/* | grep -c TEXT_TO_SEARCH

下面是使用 Runtime 类执行命令的方法:

public static String executeCommand(String command) {

StringBuffer output = new StringBuffer();

Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader 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();
}

最佳答案

Runtime.exec 不使用 shell(比如 /bin/bash);它将命令直接传递给操作系统。这意味着像 * 和管道 (|) 这样的通配符将不会被理解,因为 cat(像所有 Unix 命令一样)不会对那些字符。你需要使用类似的东西

p = new ProcessBuilder("bash", "-c", command).start();

或者,如果出于某些奇怪的原因您需要坚持使用过时的 Runtime.exec 方法:

p = Runtime.getRuntime().exec(new String[] { "bash", "-c", command });

如果您只运行那个 cat/grep 命令,您应该考虑放弃使用外部进程,因为 Java 代码可以轻松地遍历目录,从每个文件中读取行,并将它们与正则表达式匹配:

Pattern pattern = Pattern.compile("TEXT_TO_SEARCH");
Charset charset = Charset.defaultCharset();

long count = 0;

try (DirectoryStream<Path> dir =
Files.newDirectoryStream(Paths.get("/home/talha"))) {

for (Path file : dir) {
count += Files.lines(file, charset).filter(pattern.asPredicate()).count();
}
}

更新:要递归读取树中的所有文件,请使用 Files.walk :

try (Stream<Path> tree =
Files.walk(Paths.get("/home/talha")).filter(Files::isReadable)) {

Iterator<Path> i = tree.iterator();
while (i.hasNext()) {
Path file = i.next();
try (Stream<String> lines = Files.lines(file, charset)) {
count += lines.filter(pattern.asPredicate()).count();
}
};
}

关于java.lang.运行时异常 "Cannot run program",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44500899/

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