4

我用 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
4

4 回答 4

4

它适用于以下代码,

            String[] b = new String[] {"bash", "-c", "cp -R \"" + strSource + "/\"* \"" + strDestination + "/\""};  
        p = Runtime.getRuntime().exec(b);

我用谷歌搜索并找到了链接

http://www.coderanch.com/t/423573/java/java/Passing-wilcard-Runtime-exec-command

于 2013-03-07T09:35:05.677 回答
2

当您使用 的任何变体时,会直接Runtime.exec()调用二进制文件,而不是通过 shell。这意味着不支持通配符,因为没有外壳来扩展它们。

我建议使用 Java 代码来复制你的文件——它会更便携,更安全。除此之外,您可以使用 shell 二进制文件通过其-c选项执行您的命令。

于 2013-03-07T07:53:04.037 回答
1

除非您确实需要执行系统命令,否则您可以使用标准 java api 来做到这一点。

http://docs.oracle.com/javase/tutorial/essential/io/copy.html

于 2013-03-07T07:45:57.873 回答
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[]命令并在其中传递命令。

于 2017-03-11T03:50:47.643 回答