9

「*.C」ファイルをJavaで印刷しようとしています

私は以下のコードを使用します

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」コマンドでは正常に機能しています。いずれかのコマンドで「*」を使用すると、すべてが機能しません。Javaのコマンドで「*」を置き換える必要があります。

アップデート

助けてくれてありがとう。

ここで、Javaのコメント「ls-d1 $ PWD/**」に対して同じ結果が必要です。フルパスですべてのディレクトリ名が一覧表示されます。

御時間ありがとうございます。

4

6 に答える 6

14

これはより信頼できると思うかもしれません:

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

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) {
    for (Path file : stream) {
        // Do stuff with file
    }
}
于 2013-03-24T13:01:46.527 に答える
3

「bash-c'ls* .c'」の形式のコマンドを実行する必要があります...javaメソッドは拡張(グロブ)execを理解しないためです。'*'(「bash-c」形式は、シェルがコマンドラインの処理に使用されることを保証します。)

ただし、引用符が含まれているコマンド文字列を分割する正しい方法も理解していないRuntime.exec(...)ため、上記のコマンドを単一の文字列として単純に提供することはできません。exec

したがって、exec正しいことを行うには、次のようなことを行う必要があります。

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

言い換えれば、あなたは手で引数分割を行う必要があります...


FileMatcherこの例は、を使用して「グロブ」を実行し、結果から引数リストを組み立てることによっても実装できることに注意してください。しかし、実行以外のことをしている場合は複雑ですls...そしてIMOの複雑さは正当化されません。

于 2013-03-24T13:05:54.363 に答える
2

または、public File[] File.listFiles(FilenameFilter filter)

File[] files = dir.listFiles(new FilemaneFilter() {
  public boolean accept(File dir, String name) {
    return name.endsWith(".c");
  }
}
于 2013-03-24T13:02:11.117 に答える
1

*シェルによって拡張されます。したがって、これを使用してファイル名をglobとして展開するには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});
于 2013-03-24T12:52:34.983 に答える
1

Javaの方法は、を使用することFilenameFilterです。ここからコード例を採用しました:

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()

于 2013-03-24T12:59:31.743 に答える
1

Java7以降のファイルを一覧表示する1つの例。

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();
        }
    }
}
于 2013-03-24T16:23:39.163 に答える