如何使用 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());
}
这将使代码对平台的依赖性降低
我是 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());
}
这将使代码对平台的依赖性降低