2013-03-24 14 views
8

Sto provando a stampare "* .c" i file in javaCome utilizzare il comando "ls * .c" in java?

io uso il codice qui sotto

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: - Si sta lavorando bene per "ls" command.when Sto usando "* "in qualsiasi comando, non tutti funzionano. serve la sostituzione di "*" nel comando in java.

UPDATE

Grazie per il vostro aiuto ragazzi.

Ora ho bisogno dello stesso risultato per il commento "ls -d1 $ PWD/**" in java. elencherà tutti i nomi delle directory con il percorso completo.

Grazie per il vostro tempo.

+0

C'è un motivo specifico è necessario fare questo con il comando 'ls'? –

+1

[** Does getRuntime.exec() in java comprende * o no? **] (http://stackoverflow.com/questions/11789952/does-getruntime-exec-in-java-understands-or-not) –

+0

Sì ... ho bisogno di stampare i nomi file/directory con percorso completo. quindi ho provato con questo esempio. – RJSV

risposta

11

Si potrebbe trovare questo più affidabile:

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: a partire da Java 7, 'Files' dovrebbe essere la strada da percorrere. – millimoose

1

Lo * viene espanso dalla shell. Quindi, per utilizzarlo per espandere un nome file come glob, dovresti chiamare il comando ls attraverso una shell, ad es. in questo modo:

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

Modifica

Buon punto da @Stephen, circa exec non riuscendo a dividere il comando. Per eseguire il ls -d1 $PWD/* si può fare in questo modo:

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

Lo so, lo fa risposte non direttamente alla tua domanda, ma se è possibile, preferire il modo autonomo sistema operativo per elencare i file nella directory.

I vantaggi sono - non specifici per Unix/Linux Non è necessario generare il processo (è molto costoso).

Qui trovi un esempio di come fare questo in Java:

List Files in Directory

Spero che questo aiuti

+0

È considerata una cattiva pratica pubblicare solo link a (materiale che potrebbe fornire) una risposta. Questo dovrebbe essere un commento o esteso per includere nel codice una soluzione effettiva al problema degli OP nel corpo della risposta. – millimoose

1

Il modo Java è quello di utilizzare un FilenameFilter. Ho adattato un esempio di codice da 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]); 
    } 
    } 
} 

aggiornamento:

Per l'aggiornamento, si potrebbe iterare su una new File (".").listFiles(); ed emettere file.getAbsolutePath() su ogni file.

1

È necessario eseguire un comando del modulo "bash -c 'ls * .c' "...perché i metodi java exec non comprendono l'espansione '*' (globbing). (Il modulo "bash -c" garantisce che una shell venga utilizzata per elaborare la riga di comando.)

Tuttavia, non è possibile semplicemente fornire il comando precedente come una stringa singola a Runtime.exec(...), perché anche exec non comprende il modo giusto per dividere la stringa di un comandante che contiene citazioni.

Pertanto, per ottenere exec a fare la cosa giusta, è necessario fare qualcosa di simile:

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

In altre parole, è necessario fare la scissione tesi a mano ...


Si noti che questo esempio potrebbe anche essere implementato utilizzando FileMatcher per eseguire il "globbing" e assemblare l'elenco degli argomenti dai risultati. Ma è complicato se stai facendo qualcosa di diverso dall'esecuzione di ls ... e IMO la complessità non è giustificata.

+0

Questo è in qualche modo inaccurato, un'implementazione globbing esiste in Java: http://docs.oracle.com/javase/tutorial/essential/io/find.html (L'uso della shell è ancora un'opzione valida per ottenere un comportamento coerente). – millimoose

+1

@millimoose - Hai ragione. Aggiornato. –

1

Un esempio per elencare i file dal 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(); 
     } 
    } 
} 
Problemi correlati