如何使用 java 在 linux 的根目录中打印文件和文件夹列表

How do I print the list of files and folders in a root directory in linux using java

我是 Java 和 Linux 的新手,我试图使用一些 Runtime.exec() 命令来允许我的程序在 Linux 中执行命令,例如"cd /mnt/""ls --group-directories-first" 列出 /mnt/ 中包含的文件和目录,但我认为我在执行时遇到了问题。

我试过我的代码只包含 "ls --group-directories-first" 并且它工作得很好,唯一的问题是,它只列出了项目文件夹中的子目录和文件。我想让我的程序先转到 /mnt/ 所以我通过使用 exec(String[] cmdarray) 格式作为 process1 = Runtime.getRuntime().exec(new String[]{"cd /mnt/","ls --group-directories-first"}); 将我的命令行设为命令数组,当我 运行 它在 linux,它刚刚执行,没有任何打印的运行时错误,也没有任何 feedback/printed 行。

这是我的代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class linCom {
    public static void main(String args[]) {
        String s;
        Process p;

        try {
            p = Runtime.getRuntime().exec("ls --group-directories-first");
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println("line: " + s);
            p.waitFor();
            System.out.println ("exit: " + p.exitValue());
            p.destroy();
        } catch (Exception e) {}


    }
}

这有效并打印出来:

”行:DummyFolder1

行:linCom.class

行:linCom.java

出口:0

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class linCom {
    public static void main(String args[]) {
        String s;
        Process p;

        try {
            p = Runtime.getRuntime().exec(new String[]{"cd /mnt/","ls --group-directories-first"});
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println("line: " + s);
            p.waitFor();
            System.out.println ("exit: " + p.exitValue());
            p.destroy();
        } catch (Exception e) {}


    }
}

刚刚执行,没有打印行。

我希望我的程序只是转到 /mnt/ 目录并打印出那里的子目录和文件,但它只是执行,没有可见的运行时错误,也没有打印行。

我查看了其他条目,但找不到我的问题的任何答案。

编辑:我将 "no errors" 更改为 "no error messages" 以明确表示如果程序有任何错误,我没有得到任何反馈。

这是 UNIX 进程模型可能令人困惑的地方。

你尝试 运行 名为 cd /mnt/ 的程序的第一个参数是 ls --group-directories-first 。 Unix 程序可以任意命名(它们只是文件名)但是没有名为 cd /mnt 的程序。而且无论如何,cd 操作实际上是由 shell 执行的,而不是 forked/execed 程序。

您希望从您的 Java 程序中 运行 这个 shell 命令:cd /mnt/; ls --group-directories-first。问题是,Java's .exec() method 没有给你一个 shell,所以 shell 命令不起作用。

您可以试试这个。就像 运行 执行 shell 命令

/bin/sh -c "cd /mnt/; ls --group-directories-first"

有了这个,你可以启动一个 shell,然后告诉它 运行 -c你想要的命令。

Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh",
                                                   "-c",
                                                   "cd /mnt/; ls --group-directories-first"});  

但这在很大程度上取决于 Java 程序 运行 所在的机器,所以要小心。

参考:How to invoke a Linux shell command from Java

不要仅仅为了列出文件而使用外部进程。 Java 有很多方法可以做到这一点。全部都在Filesclass。例如:

Path dir = Paths.get("/mnt");
try (Stream<Path> files = Files.list(dir).sorted(
    Comparator.comparing((Path p) -> !Files.isDirectory(p))
        .thenComparing(Comparator.naturalOrder()))) {

    files.forEach(System.out::println);
}

真的需要来使用Runtime.exec()命令吗?这将使您的代码平台依赖。

您可以使用 File.listFiles():

File folder = new File("/mnt");
for (File f : folder.listFiles()) {
    System.out.println(f.getName());
}

这将使代码对平台的依赖性降低