我需要知道文件列表中是否包含特定字符串。文件列表是动态的,我必须检查动态的字符串列表。这必须在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();
我还尝试了很多其他方法来连接命令,但是我收到了一条错误消息(例如找不到文件)或者进程永远不会回来。
我的问题: 你知道更好的办法吗? 2.如果不是:您是否在代码中看到任何错误? 3.如果没有:你有其他方法我应该尝试运行该命令吗?
提前致谢。
答案 0 :(得分: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();
}
}
答案 1 :(得分:1)
Java对子进程的支持非常弱,特别是在Windows上。如果你真的不需要来避免使用那个API。
相反,this SO question讨论了如何替换递归搜索的find
,而grep
应该很容易(尤其是FileUtil.readLines(…)
来帮助)。