我用getRuntime()API编写了一个小的java代码,用于将文件从一个目录复制到另一个目录,它失败了,我无法理解为什么?当我从shell运行命令它运行正常,任何人都可以,让我知道我正在做的错误
private static void copyFilesLinux(String strSource, String strDestination) {
String s;
Process p;
try {
// cp -R "/tmp/S1/"* "/tmp/D1/"
p = Runtime.getRuntime().exec(
"cp -R '" + strSource + "/'* '" + strDestination + "/'");
System.out.println("cp -R \"" + strSource + "/\"* \"" + strDestination + "/\"");
System.out.println("cp -R '" + strSource + "/'* '" + strDestination + "/'");
System.out.println(p.toString());
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 (InterruptedException iex) {
iex.printStackTrace();
}
catch (IOException iox) {
iox.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
输出:
cp -R "/tmp/S1/"* "/tmp/D1/"
cp -R '/tmp/S1/'* '/tmp/D1/'
java.lang.UNIXProcess@525483cd
exit: 1
答案 0 :(得分:2)
当您使用Runtime.exec()
的任何变体时,二进制文件直接称为 ,而不是通过shell。这意味着wildcards are not supported,因为没有shell来扩展它们。
我建议使用Java代码来复制文件 - 它会更便携,更安全。除此之外,您可以使用shell二进制文件通过其-c
选项执行命令。
答案 1 :(得分:1)
除非您确实需要执行系统命令,否则可以使用标准java api执行此操作。
http://docs.oracle.com/javase/tutorial/essential/io/copy.html
答案 2 :(得分:1)
它适用于以下代码,
String[] b = new String[] {"bash", "-c", "cp -R \"" + strSource + "/\"* \"" + strDestination + "/\""};
p = Runtime.getRuntime().exec(b);
我用Google搜索并找到了链接
http://www.coderanch.com/t/423573/java/java/Passing-wilcard-Runtime-exec-command
答案 3 :(得分:1)
以下代码对我有用。
public static void main(String []args) throws Exception{
String s;
Process p;
try {
String b[] = new String[4];
b[0] = "cp";
b[1] = "-R";
b[2] = "HelloWorld.java";
b[3] = "abc.java";
p = Runtime.getRuntime().exec(b);
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) {}
}
}
创建String[]
个命令并传递命令。