java - 使用Java运行 "tar"命令,但生成tar文件需要花费大量时间

标签 java tar runtime.exec

在我的项目中,我需要为用户生成一个代理,该代理包括一些jar(约22M),一些源类(约200k)和一个XML。服务器将为不同的用户生成不同的xml,所以我必须动态生成代理。我使用 Runtime.getRuntime().exec("tar...") 来 tar 文件以生成代理。

当我运行单元测试时,生成花费了很多时间,每个代理大约需要 2 分钟。我不能让用户等待一个页面2分钟......那么是否存在任何其他方法可以使这个程序更加高效,或者有另一种方法可以快速流畅地生成代理?感谢!

 /**
  * tar the agents
  * @param inputFiles agent files
  * @param outputFile agent tar
  * @param baseDir the directory path to run "tar" command
  */
 public static void tarFile(String[] inputFiles,String outputFile,String baseDir){
     String cmd="tar -zcf "+outputFile+" ";
     for (int i = 0; i < inputFiles.length; i++) {
        cmd+=inputFiles[i]+" ";
    }
     System.out.println(cmd);
     try {
        Process process=Runtime.getRuntime().exec(cmd, null, new File(baseDir));
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
        String s;
        while ((s=bufferedReader.readLine())!=null) {
            System.out.println(s);
        }
        process.waitFor();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

这是我的tar类,param--basedir是设置命令的执行路径

最佳答案

我需要查看您传递给 Runtime.getRuntime().exec 的实际 tar 命令。

有 4 个因素真正影响将文件压缩成 tarball 的速度:

  1. 机器上的 CPU 速度
  2. 盒子上的 I/O 速度
  3. 要归档的源数据量
  4. 压缩

rzymek 指出您可以使用 Apache Commons Compress 本地生成该文件。但是,我不确定这会更快,除非我们了解命令行方法的约束是什么。

如果你自己使用 shell 来 tar ,速度可以比较吗?如果是这样,请尝试降低压缩比,甚至完全关闭它(删除 tar czf 中的“z”选项)。

如果您正在压缩 tar 文件并且需要压缩它,那么如果 XML 很小,您可以预先压缩 JAR 文件(如果我记得的话,我认为它们已经被压缩了,但是您可能需要检查压缩率),然后使 tarball 解压缩,因为压缩压缩文件不会完成任何任务(有时会更慢!)

关于java - 使用Java运行 "tar"命令,但生成tar文件需要花费大量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20545054/

相关文章:

java - 如何获取图像文件并将其转换为栅格,然后访问其数据?

ruby - Cron 和 Ruby.. "puts ` 系统命令`"有什么作用吗?

linux - `tar/home/user/file` 是否将/home 所有者更改为 root?

java - 获取 java.io.IOException : CreateProcess: c:\Windows\System32\My_exe 1 error=2

java - 将树状映射转换为具有复合键的普通映射

java - 在过滤器中注入(inject) SessionScoped cdi bean - 不为不同的 session 重新注入(inject)?

java - Linux 命令没有给出在 java 程序中调用的输出

带有参数的 VBA 脚本的 Java Runtime Exec

java - 在字符串变量上使用 ?eval 时,Freemarker 返回 null

java - 使用 Apache Commons 压缩库以不依赖于机器的方式将文件和轨道添加到 Tar 存档中