如何在linux中使用java打印根目录中的文件和文件夹列表
我对Java和Linux都是新手,我曾尝试使用一些如何在linux中使用java打印根目录中的文件和文件夹列表,java,linux,unix,processbuilder,runtime.exec,Java,Linux,Unix,Processbuilder,Runtime.exec,我对Java和Linux都是新手,我曾尝试使用一些Runtime.exec()命令来允许我的程序在Linux中执行命令,例如“cd/mnt/”和“ls--groupdirectories first”来列出/mnt/中包含的文件和目录,但我认为我的执行有问题 我试着用我的代码只包含“ls--group directories first”,效果很好,唯一的问题是,它只列出了projects文件夹中的子目录和文件。我想让我的程序先转到/mnt/所以我使用exec(String[]cmdarray)
Runtime.exec()
命令来允许我的程序在Linux中执行命令,例如“cd/mnt/”
和“ls--groupdirectories first”
来列出/mnt/中包含的文件和目录,但我认为我的执行有问题
我试着用我的代码只包含“ls--group directories first”
,效果很好,唯一的问题是,它只列出了projects文件夹中的子目录和文件。我想让我的程序先转到/mnt/所以我使用exec(String[]cmdarray)
格式将命令行设置为process1=Runtime.getRuntime().exec(新字符串[]{“cd/mnt/”,“ls--group directories first”})当我在linux上运行它时,它的执行没有任何打印的运行时错误,也没有任何反馈/打印行
这是我的密码:
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“
这只是在没有打印行的情况下执行的
我希望我的程序只是转到/mnt/目录并在那里打印出子目录和文件,但它只是在没有可见运行时错误和打印行的情况下执行
我看过其他条目,但找不到任何问题的答案
编辑:我将“无错误”改为“无错误消息”,以清楚地表明,如果程序有任何错误,我不会得到任何有关它的反馈。这里是UNIX进程模型可能令人困惑的地方
您尝试运行名为cd/mnt/
的程序,第一个参数为ls--首先对目录进行分组
。Unix程序可以命名为任何名称(它们只是文件名),但没有名为cd/mnt
的程序。无论如何,cd操作实际上是由shell执行的,而不是作为分叉/执行的程序
您希望从Java程序运行这个shell命令:cd/mnt/;ls--首先对目录进行分组
。问题是,没有给您一个shell,因此shell命令不起作用
你可以试试这个。这就像运行shell命令一样
/bin/sh -c "cd /mnt/; ls --group-directories-first"
这样,您可以启动一个shell,然后告诉它运行所需的命令
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh",
"-c",
"cd /mnt/; ls --group-directories-first"});
但是它非常依赖于运行Java程序的机器,所以要小心
参考资料:不要仅使用外部进程来列出文件。Java有很多方法可以做到这一点。他们都在班上。例如:
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);
}
Path dir=Path.get(“/mnt”);
try(streamfiles=files.list(dir).sorted(
Comparator.comparing((路径p)->!Files.isDirectory(p))
.Then比较(Comparator.naturalOrder())){
files.forEach(System.out::println);
}
您真的需要使用Runtime.exec()
命令吗?这将使您的代码平台依赖
您可以使用File.listFiles()
:
这将使代码不那么依赖于平台形式只是为了记录:永远不要使用空的catch块。忽略错误是没有意义的。至少可以使用“e.printStackTrace()”,例如,“这只是在没有错误的情况下执行的”。。。如果抑制异常,您现在将如何处理?但是,这里的要点是:你不能像那样“组合”命令。打开一个终端,自己键入这些命令。您得到的输出是什么?你确定/mnt
中有子目录吗?谢谢,这正是我的问题,你解决了!可惜我不能像以前那样投票
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);
}
File folder = new File("/mnt");
for (File f : folder.listFiles()) {
System.out.println(f.getName());
}