2013-03-24 44 views
8

我想打印 「* .C」 在java文件如何在java中使用「ls * .c」命令?

我用下面的代碼

public static void getFileList(){ 
    try 
    { 
     String lscmd = "ls *.c"; 
     Process p=Runtime.getRuntime().exec(lscmd); 
     p.waitFor(); 
     BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line=reader.readLine(); 
     while(line!=null) 
     { 
      System.out.println(line); 
      line=reader.readLine(); 
     } 
    } 
    catch(IOException e1) { 
     System.out.println("Pblm found1."); 
    } 
    catch(InterruptedException e2) { 
     System.out.println("Pblm found2."); 
    } 

    System.out.println("finished."); 
} 

PS: - 這是工作的罰款爲 「LS」 command.when我使用「* 「在任何命令中,一切都不起作用。需要在java中的命令中替換「*」。

UPDATE

感謝您的幫助球員。

現在我需要在java中評論「ls -d1 $ PWD/**」的相同結果。它將用完整路徑列出所有的目錄名稱。

謝謝你的時間。

+0

有沒有你需要用'ls'命令來做到這一點任何具體的原因是什麼? – 2013-03-24 12:52:58

+1

[**在java中getRuntime.exec()是否理解*或不是?**](http://stackoverflow.com/questions/11789952/does-getruntime-exec-in-java-understands-or-not) – 2013-03-24 12:57:47

+0

是啊...我需要用完整路徑打印文件/目錄名稱。所以我嘗試了這個例子。 – RJSV 2013-03-24 12:59:51

回答

11

您可能會發現這更可靠:

Path dir = Paths.get("/path/to/directory"); 

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) { 
    for (Path file : stream) { 
     // Do stuff with file 
    } 
} 
+0

+1:從Java 7開始,「文件」應該是最好的選擇。 – millimoose 2013-03-24 16:32:04

1

*由shell擴展。因此,要使用它擴展一個文件名作爲glob,你必須通過一個shell調用ls命令,例如,像這樣:

String lscmd = " bash -c 'ls *.c' "; 

編輯

從@Stephen好點,約EXEC不能分裂命令。要執行ls -d1 $PWD/*,你可以做這樣的:

String lscmd = "ls -d1 $PWD/*"; 
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd}); 
-1

我知道,它並不直接回答你的問題,但是如果可以的話,更喜歡獨立於操作系統的方式在目錄中列出文件。

的優點是 - 不是Unix/Linux的具體 不需要產卵過程(它非常昂貴)。

在這裏你可以找到如何做到這一點在Java中的例子:

List Files in Directory

希望這有助於

+0

只發布鏈接到(可能提供)答案的鏈接被認爲是不好的做法。這應該是一個評論,或者擴展到包含解決方案體內OPs問題的實際解決方案的代碼。 – millimoose 2013-03-24 16:31:09

1

Java的方法是使用一個FilenameFilter。我適應一個代碼示例從here

import java.io.File; 
import java.io.FilenameFilter; 
public class Filter implements FilenameFilter { 

    protected String pattern; 

    public Filter (String str) { 
    pattern = str; 
    } 

    public boolean accept (File dir, String name) { 
    return name.toLowerCase().endsWith(pattern.toLowerCase()); 
    } 

    public static void main (String args[]) { 

    Filter nf = new Filter (".c"); 

    // current directory 
    File dir = new File ("."); 
    String[] strs = dir.list(nf); 

    for (int i = 0; i < strs.length; i++) { 
     System.out.println (strs[i]); 
    } 
    } 
} 

更新:

爲您更新,你可以對每個文件遍歷一個new File (".").listFiles();併發出file.getAbsolutePath()

1

您需要執行的形式「的bash -c 'LS的* .c' 的命令「...因爲java exec方法不明白'*'擴展(globbing)。 (「bash -c」形式確保shell用於處理命令行)

但是,不能簡單地將上述命令作爲單個字符串提供給Runtime.exec(...),因爲exec也不理解正確的方法來分割引用它的acommand字符串。

因此,爲了獲得exec做正確的事情,你需要做這樣的事情:

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

換句話說,你需要做手工的說法分裂...


應該注意的是,這個例子也可以通過使用FileMatcher執行「通配」並從結果中組裝參數列表來實現。但是,如果你正在運行除了運行ls ......和IMO的複雜性是不合理的,那麼這很複雜。

+0

這在某種程度上是不準確的,Java中存在一個globbing實現:http://docs.oracle.com/javase/tutorial/essential/io/find.html(使用shell仍然是獲取一致行爲的有效選項。) – millimoose 2013-03-24 16:29:32

+1

@millimoose - 你是對的。更新。 – 2013-03-24 22:52:55

1

一個例子,列出文件,因爲Java 7中

import java.io.IOException; 
import java.nio.file.DirectoryStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
public class Main { 
    public static void main(String[] args) { 
     Path dir = Paths.get("/your/path/"); 
     try { 
      DirectoryStream<Path> ds = Files.newDirectoryStream(dir, "*.{c}"); 
      for (Path entry: ds) { 
       System.out.println(entry); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}