Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux中使用java打印根目录中的文件和文件夹列表_Java_Linux_Unix_Processbuilder_Runtime.exec - Fatal编程技术网

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

如何在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)

我对Java和Linux都是新手,我曾尝试使用一些
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”})
这是我的密码:

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