通过Java直接和间接访问系统命令有问题吗?
我想列出所有文件,并使用Java运行时将列表写入.txt文件。我做到了:通过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脚本中的内容:
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实现更快、更容易,尽管它不具有可移植性。