2009-11-18 104 views
0

我正在尝试使用Java运行时类压缩和存档文件夹中的所有文件。我的代码片段看起来就象这样:使用Java运行时压缩和存档文件夹中的文件

public static void compressFileRuntime() throws IOException, InterruptedException { 

    String date = Util.getDateAsString("yyyy-MM-dd"); 
    Runtime rt = Runtime.getRuntime(); 
    String archivedFile = "myuserData"+date+".tar.bz2"; 
    String command = "tar --remove-files -cjvf "+archivedFile+" marketData*"; 
    File f = new File("/home/amit/Documents/"); 
    Process pr = rt.exec(command, null, f); 
    System.out.println("Exit value: "+pr.exitValue()); 
} 

上面的代码不存档和压缩文件如预期,虽然它创建文件夹“/home/amit/Documents/”在文件myuserData2009-11-18.tar.bz2

另外的输出是

Exit value: 2. 

虽然我是否来自命令行执行相同的命令,它给出了预期的结果。

请告诉我我失踪了。

感谢
阿米特

回答

2

问题就出在这个部分:

" marketData*" 

你希望要压缩的文件名必须从*通配符晶片被保护。 Globbing由外壳完成,而不是由工具本身完成。你的选择是要么:

  • 算出来的文件进行归档自己
  • 启动shell执行的命令(“/ bin/sh的-c”)包含文件的文件夹
  • 开始焦油要存档

编辑: 对于外壳选项,命令如下所示:

String command = "sh -c \"tar --remove-files -cjvf "+archivedFile+" marketData*\""; 

(介意\" s表示划定的命令由shell执行,不要用单引号加时赛外壳不会解释水珠。)

+0

感谢rsp。 但该文件夹包含许多其他类型的文件,我只需要存档以marketData开头的文件。此外,文件通过FTP转储到该文件夹​​中,文件数量也不相同。所以使用你指定的第一种或第三种方法似乎很难。 我会尝试第二个。你能否详细说明一下。 谢谢, – Amit 2009-11-18 11:16:42

+0

它的工作 谢谢 – Amit 2009-11-18 12:10:32

1

(不是你的问题的答案,更多的是建议的),为什么不试试this代替。

+0

由于两个主要原因,我没有尝试上述: 1.压缩在bz2格式更好。我需要每天压缩文件一次。 2.我需要一次性删除已存档的文件。 – Amit 2009-11-18 11:05:13

1

如果真的是你想创建一个bzip2的存档,我会使用Java实现而不是本地命令,这对于可移植性很有好处,例如http://www.kohsuke.org/bzip2/(尽管它并未真正优化,压缩似乎比使用Java LZMA更慢)。