java - 从 Java 调用 GnuWin 命令还是有更好的方法?

标签 java runtime

我需要知道文件列表中是否包含特定字符串。文件列表是动态的,我必须检查动态字符串列表。这必须在 Java 中完成才能处理结果(true 或 false)。 MS Windows 也是一个要求。

我想到了这个问题,我尝试使用unix方式来做到这一点:

find C:/temp | xargs grep import -sl

使用 GnuWin,这可以在 cmd 中运行,没有任何问题。所以我尝试将其转换为Java语言。我读了很多关于使用 Runtime 类和 ProcessBuilder 类的文章。但这些技巧都不起作用。最后我尝试了以下两个代码片段:

String binDir = "C:/develop/binaries/";

List<String> command = new ArrayList<String>();
command.add("cmd");
command.add("/c");
command.add(binDir+"find");
command.add("|");
command.add(binDir+"xargs");
command.add(binDir+"grep");
command.add("import");
command.add("-sl");

ProcessBuilder builder = new ProcessBuilder(command);
builder.directory(new File("C:/temp"));
final Process proc = builder.start();

printToConsole(proc.getErrorStream());
printToConsole(proc.getInputStream());

int exitVal = proc.waitFor();

String binDir = "C:/develop/binaries/";
String strDir = "C:/temp/";

String[] command = {"cmd.exe ", "/C ", binDir + "find.exe " + strDir + " | " + binDir + "xargs.exe " + binDir + "grep.exe import -sl" };

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);

printToConsole(proc.getErrorStream());
printToConsole(proc.getInputStream());

int exitVal = proc.waitFor();

我还尝试了许多其他方法来连接命令,但要么收到错误消息(例如找不到文件),要么进程永远不会返回。

我的问题: 1.你知道更好的方法来完成这项工作吗? 2. 如果没有:您发现代码中有任何错误吗? 3.如果没有:我还有其他方法可以尝试运行该命令吗?

提前致谢。

最佳答案

Java 对子进程的支持相当弱,尤其是在 Windows 上。如果您确实不需要,请避免使用该 API。

相反,this SO question讨论如何替换递归搜索的 find ,并且 grep 应该足够简单(特别是 FileUtil.readLines(…) 来帮助)。

关于java - 从 Java 调用 GnuWin 命令还是有更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10282595/

相关文章:

java - 如果它是 "Write once run anywhere",为什么这么多 Java 程序告诉我为我的操作系统选择版本?

Delphi - 无法引用在运行时创建的对象

java - 使用包装器通过 Runtime.exec() 运行命令

java - Play 应用程序全局设置的混合

java - t.page 上的 Freemarker utf-8 编码问题

java - 是否可以在 java 中将 .swf 文件转换为 base64 格式

delphi - 根据类类型在运行时创建Delphi对象

java - 从 Java 运行 AWK 创建文件并使用 BufferedReader 读取它

c++ - 我可以使用针对 2008 VS Runtime 的构建和 VS 2010 而没有 VS 2008 的拷贝吗?

assembly - 二进制如何转换为硬件?