2013-03-07 68 views
4

我已经用getRuntime()API编写了一个小型java代码来将文件从一个目录复制到另一个目录,但它失败了,我无法理解为什么?当我从shell中运行命令它运行良好,任何人都可以,请让我知道我现在做的错误从Java程序Linux复制文件

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/' 

[email protected] 

exit: 1 
+0

不应该在引号内?像:'cp -R“/ tmp/S1/*”“/ tmp/D1 /”' – Ash 2013-03-07 07:45:48

+1

@Ash:在这种情况下,它没有区别 - 通配符不会在Runtime.exec()中扩展。然而,在shell提示符下,将'*'放在引号内可以防止通过globbing扩展 - 这通常不是人们想要的... – thkala 2013-03-07 07:58:37

+0

这是我得到的错误cp:can stat'/ tmp/S1/* ':没有这样的文件或目录 – Sandeep540 2013-03-07 07:59:24

回答

1

你可以做,使用标准的Java API,除非你有真的需要执行系统命令。

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

+0

我正在使用JDK 6,截至目前无法使用JDK 7 – Sandeep540 2013-03-07 08:00:21

+0

查看Apache Commons FileUtils。这也可以使它更容易。 http://commons.apache.org/proper/commons-io///apidocs/org/apache/commons/io/FileUtils.html – 2013-03-07 08:03:38

+0

如果我使用apache commons-io库中的“FileUtils”类来复制文件从文件夹A到B,它是否会在操作系统级别传输文件(或)它会使用JVM吗?我问,因为我有超过1GB大小的文件,并且如果涉及JVM,可能会出现问题 – Sandeep540 2013-03-07 08:06:07

2

当您使用的Runtime.exec()任何变化,二元被称为直接,而不是通过一个壳。这意味着wildcards are not supported,因为没有外壳可以扩展它们。

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

+0

假设我使用apache commons-io库中的“FileUtils”类将文件夹A中的文件复制到B,它会不会在操作系统级别(或)传输文件是否会使用JVM? 我在问,因为我的文件大小超过1GB,如果涉及到JVM,它可能是一个问题 – Sandeep540 2013-03-07 08:01:34

+0

_thkala_是对的。只是扩大他的答案。运行你的副本为_“bash -c cp -R dir1 dir2”_或_“sh -c cp ...”_ – 2013-03-07 08:10:24

+0

试过这个 - “p = Runtime.getRuntime().exec(”bash -c cp -R \“”+ strSource +“/ \”* \“”+ strDestination +“/ \”“);'不幸运 – Sandeep540 2013-03-07 08:22:21

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[]并传入的命令。