Linux从Java程序复制文件

时间:2013-03-07 07:30:45

标签: java linux copy

我用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 个答案:

答案 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[]个命令并传递命令。