9

我正在尝试在 java 中打印“*.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”命令工作正常。当我在任何命令中使用“*”时,所有命令都不起作用。需要在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'”形式的命令...因为 javaexec方法不理解'*'扩展(globbing)。(“bash -c”形式确保使用 shell 来处理命令行。)

但是,您不能简单地将上述命令作为单个字符串提供给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通过 shell 调用命令,例如:

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]);
    }
  }
}

更新:

对于您的更新,您可以在每个文件上迭代 anew File (".").listFiles();和 issue 。file.getAbsolutePath()

于 2013-03-24T12:59:31.743 回答
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();
        }
    }
}
于 2013-03-24T16:23:39.163 回答