0

我需要知道文件列表中是否包含特定字符串。文件列表是动态的,我必须检查字符串的动态列表。这必须在 Java 中完成才能处理结果(真或假)。并且 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. 如果没有:您有其他方法我应该尝试运行该命令吗?

提前致谢。

4

2 回答 2

1

从我的头顶:

File yourDir = new File("c:/temp");
File [] files = yourDir.listFiles();
for(File f: files) {
     FileInputStream fis = new FileInputStream(f);
     try {
         BuffereReaded reader = new BufferedReader(new InputStreamReader(fis,"UTF-8")); // Choose correct encoding
         String s;
         while(((s=reader.readLine())!=null) {
             if (s.contains("import"))
              // Do something (add file to a list, for example). Possibly break out the loop
         }
     } finally {
           if (fis!=null)fis.close();
     }
}
于 2012-04-23T14:56:22.320 回答
1

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

相反,this SO question讨论了如何替换find递归搜索,并且grep应该很容易(尤其是FileUtil.readLines(…)帮助)。

于 2012-04-23T15:08:30.737 回答