2013-03-24 12 views
8

Próbuję wydrukować "* .c" pliki w JavieJak korzystać z polecenia "ls * .c" w języku Java?

używam poniższy kod

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: - To działa dobrze dla "ls" command.when używam „* "w każdym rozkazie, wszystkie nie są pracą. potrzebujemy zastąpienia "*" w poleceniu w java.

UPDATE

Dzięki za pomoc chłopaki.

Teraz potrzebuję tego samego wyniku dla komentarza "ls -d1 $ PWD/**" w java. wyświetli listę wszystkich nazw katalogów z pełną ścieżką.

Dzięki za poświęcony czas.

+0

Czy jest jakiś szczególny powód, trzeba to zrobić z poleceniem 'ls'? –

+1

[** Czy getRuntime.exec() w java rozumie * lub nie? **] (http://stackoverflow.com/questions/11789952/does-getruntime-exec-in-java-understands- or-not) –

+0

Tak ... muszę wydrukować nazwy plików/katalogów z pełną ścieżką. więc próbowałem z tym przykładem. – RJSV

Odpowiedz

11

Można znaleźć to bardziej wiarygodne:

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: od wersji 7 Java 'Files' powinno być drogą do zrobienia. – millimoose

1

Numer * jest rozszerzony przez powłokę. Aby użyć go do rozwinięcia nazwy pliku jako globu, musiałbyś wywołać komendę ls przez powłokę, np. tak:

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

Edit

Dobry punkt z @Stephen, o Exec upadającego podzielić komendę. Aby wykonać ls -d1 $PWD/* można zrobić to tak:

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

wiem, to nie bezpośrednio odpowiedzi na swoje pytanie, ale jeśli mogę, wolę niezależną drogę OS do listy plików w katalogu.

Zalety to - nie dotyczy Uniksa/Linuksa Nie wymaga odrodzenia procesu (jest bardzo drogi).

Tutaj można znaleźć przykład, jak to zrobić w Java:

List Files in Directory

Nadzieja to pomaga

+0

Uważa się, że złą praktyką jest zamieszczanie tylko linków do (materiału, który może dostarczyć) odpowiedzi. Powinno to być komentarzem lub rozszerzeniem, aby uwzględnić rzeczywiste rozwiązanie problemu OP w treści odpowiedzi. – millimoose

1

Sposób Java jest użycie FilenameFilter. I dostosowany przykład kodu z 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]); 
    } 
    } 
} 

zmiana:

Dla aktualizacji, można iteracyjne nad new File (".").listFiles(); i wydać file.getAbsolutePath() na każdym pliku.

1

trzeba wykonać polecenie w formie „bash -c 'ls * .c' "...ponieważ metody java exec nie rozumieją rozszerzania (globowania) w wersji '*'. (Formularz "bash-c" zapewnia, że ​​do przetwarzania wiersza poleceń jest używana powłoka).

Jednak nie można po prostu podać powyższego polecenia jako pojedynczego ciągu znaków do Runtime.exec(...), ponieważ exec również nie rozumie właściwy sposób na podzielenie ciągu znaków acommand, który się w nim cytuje.

Dlatego, aby uzyskać exec aby zrobić dobry uczynek, trzeba zrobić coś takiego:

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

Innymi słowy, trzeba zrobić podział argument strony ...


Należy zauważyć, że ten przykład może być również zaimplementowany za pomocą FileMatcher, aby wykonać "globowanie" i złożyć listę argumentów z wyników. Ale jest skomplikowane, jeśli idziesz coś innego niż bieganie ls ... i IMO złożoność nie jest uzasadniona.

+0

To jest trochę niedokładne, implementacja globowania nie istnieje w Javie: http://docs.oracle.com/javase/tutorial/essential/io/find.html (Używanie powłoki jest wciąż poprawną opcją dla uzyskania spójnego zachowania). – millimoose

+1

@millimoose - Masz rację. Zaktualizowano. –

1

Przykładem do listy plików, ponieważ 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(); 
     } 
    } 
} 
Powiązane problemy