Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
通过Java直接和间接访问系统命令有问题吗?_Java_System - Fatal编程技术网

通过Java直接和间接访问系统命令有问题吗?

通过Java直接和间接访问系统命令有问题吗?,java,system,Java,System,我想列出所有文件,并使用Java运行时将列表写入.txt文件。我做到了: File workDir = new File("/home/name/ghost/"); String cmd = "ls -l > data.txt"; Process pr = Runtime.getRuntime().exec(cmd, null , workDir); 直到我用shell脚本替换cmd命令,它才起作用: String cmd = "./shell.sh"; 下面是shell脚本中的内容:

我想列出所有文件,并使用Java运行时将列表写入.txt文件。我做到了:

File workDir = new File("/home/name/ghost/");
String cmd = "ls -l > data.txt";
Process pr = Runtime.getRuntime().exec(cmd, null , workDir);
直到我用shell脚本替换cmd命令,它才起作用:

String cmd = "./shell.sh";
下面是shell脚本中的内容:

#!/bin/bash
ls -l > data.txt
exit 0

我想问一下为什么我不能通过Java直接访问系统命令?

我甚至不想回答这个问题,因为同样的事情也可以通过Java完成,而不依赖外部进程:

    File dir = new File("/some/dir");
    FileWriter fw = new FileWriter(new File("/some/file"));
    for (File f : dir.listFiles()) {
        fw.write(f.getName() + "\n");
    }
    fw.close();

问题是
操作符是shell的一个特性,而不是Java或
ls
命令的特性


Runtime.exec
不尝试复制任何类似shell的行为;它只是尝试执行你给它的命令。第二个示例之所以有效,是因为它显式地使用Bash运行
ls-l>data.txt
命令,并且Bash知道如何处理


如果可以,最好使用@whaley建议的方法;否则,使用shell脚本可能是获取shell语义的唯一方法。

Runtime.exec
不会做您认为它会做的事情。在您的命令中,它调用带有参数“-l”、“>”和“data.txt”的“ls”,这就是问题所在。就好像你写过这样的话:

String[] cmd = new String[] {"ls", "-l", ">", "data.txt"};
如果您确实想调用shell并使用shell的重定向操作符,这很简单,可以使用命令作为shell的参数调用shell:

String[] cmd = new String[] {"sh", "-c", "ls -l > data.txt"};

当然,正如其他答案所建议的那样,您可以用Java来实现这一点。

当您可以使用Java.io时,为什么要使用系统命令来实现这一点,因为它不会是可移植的?当然,它比您正在使用的shell脚本一行代码还要多,但是您在开始编写java代码的那一刻就已经接受了这一点。我不知道您所说的java.io。你能更详细地了解它吗?你应该考虑这是一个示例脚本,目的是为了运行更复杂的脚本。你可以手动使用GETOutPoSt流并写入文件。但是,我同意在这个例子中这是没有意义的。实际上我想调用g++命令。我用ls-l来表示simplicity@silentbang:此处的
>
是重要的一位。通常,Java不理解
命令>文件
,因为
只对shell有意义。如果您真的想将输出重定向到文件,我建议您使用shell脚本方法运行。它将比从Java实现更快、更容易,尽管它不具有可移植性。