2012-04-23 28 views
0

我需要知道一個特定的字符串是否包含在文件列表中。文件列表是動態的,我必須檢查一個動態的字符串列表。這必須在Java中完成以處理結果(true或false)。而MS Windows也是一項要求。從Java調用GnuWin命令還是有更好的方法嗎?

我想過這個問題,我試圖使用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(); 

我也嘗試過很多其他的方式來Concat的命令,但無論我得到(例如文件未找到)的錯誤信息或者這個過程永遠不會回來。

我的問題:1。 你知道一個更好的方式來做好這項工作? 2.如果不是:你看到代碼中有錯誤嗎? 3.如果沒有:你有另一種方法我應該嘗試運行該命令嗎?

在此先感謝。

+0

我在第一次嘗試時沒有看到您的strDir。這是一個錯字嗎? – 2012-04-23 14:40:38

+0

不,第二個strDir由'builder.directory(新文件(「C:/ temp」));'在第一個中設置。 – 2012-04-23 14:43:59

+1

難道你不會混淆strDir和binDir嗎?無論如何,我個人寧願嘗試用Java代碼來做到這一點,如果需要的話,也可以使用與你的cmd相同的Java庫/框架。雖然我喜歡Unix命令的能力,但你所寫的代碼不是很強大,也不是很便攜。 – 2012-04-23 14:46:29

回答

1

Java的子流程的支持是相當薄弱的,特別是在Windows上。如果你真的不需要需要來避免使用該API。

相反,this SO question討論如何更換find爲遞歸搜索,以及grep應該是很容易(尤其是FileUtil.readLines(…)幫助)。

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(); 
    } 
} 
+0

你知道一個POSIX'find'默認是遞歸的嗎? – 2012-04-23 15:09:37

+0

@DonalFellows是:-)這只是一小段代碼來說明我如何做到這一點。我認爲使用遞歸方法並不困難。 – 2012-04-23 16:20:51

相關問題