tyroOfJava 2010-05-21 11:51
浏览 304
已采纳

关于java调用winRAR命令行生成压缩包不能正常退出的问题

小弟菜鸟,现在在给客户做一个java程序调用winRAR命令行,生成一个压缩包,供用户下载的功能。现在这个功能倒是完成了,但是有个问题,那就是如果需要添加进压缩包的附件比较大,比如说超过了5M,则winrar程序一直在运行,不能正常退出,导致java主程序一直被挂起,用户打包下载rar压缩包失败。

代码如下:
[code="java"]
/**
* 每次只是添加一个文件进压缩包,这样做没出现过问题
* @param RARCMD winrar进行压缩的命令行,格式为 D:\Program Files\WinRAR\Rar.exe a -ep
* @param fileName 需要压缩的文件名(必须包含路径) ,如果该参数为null或者为空字符串,则直接返回,不做任何事
* @param RARRealpath 压缩后的压缩文件存放路径,包含文件名
* @throws Exception
*/
public static void RARFile(String RARCMD, String fileName, String RARRealpath) throws Exception {

    if (fileName == null) {
        return;
    }
    fileName = fileName.trim();

    if (fileName.equals("")) {
        return;
    }

    String exec = RARCMD + " " + RARRealpath + " " + fileName;
    Runtime rt = Runtime.getRuntime();
    Process p = rt.exec(exec);

    // 当前线程等待该process结束,既挂起主线程
    p.waitFor();
}

[/code]

如果我这么调用:
[code="java"]
RARFile("D:\Program Files\WinRAR\Rar.exe a -ep", "d:\字符串2", "d:\download.rar");
[/code]
其中待添加进压缩包“d:\download.rar”的文件"d:\字符串2",如果文件"d:\字符串2",超过5M(没有精确测试多大,但是超过5M肯定就不行了),那么,程序执行到
[code="java"]p.waitFor();[/code]
就不动弹了,打开任务管理器,可以看到Rar.exe一直在运行,不会自行结束。这样的话,java当前的线程一直被挂起,导致用户下载rar压缩包失败。
但是相同的winRAR命令行,比如说:
[code="java"]
D:\Program Files\WinRAR\Rar.exe a -ep d:\download.rar d:\字符串2
[/code]
在cmd下执行,却任何问题没有,不用几秒就压缩完毕,打开任务管理器,Rar.exe也正常退出,在D盘根目录下,也正确的生成了“download.rar”压缩包。

现在的问题就是,在cmd下执行rar命令行,和在java里执行相同的命令行,Rar.exe有不同的反应,如果需要压缩的文件比较大(超过5M),则在java里就不行。请教各位高手,这个问题应该怎么解决?

对了,winRAR的版本是3.92

  • 写回答

2条回答

  • weixin_42518082 2010-05-21 13:04
    关注

    小文件一下就压缩完成了, 所以可以, 但是文件大了, winrar会输出压缩的百分比信息, 需要将这些信息读取出来, 否则输出流阻塞了, winrar处于等待状态...

    [code="java"]public static void RARFile(String RARCMD, String fileName, String RARRealpath) throws Exception {

    if (fileName == null) {
    return;
    }
    fileName = fileName.trim();

    if (fileName.equals("")) {
    return;
    }

    String exec = RARCMD + " " + RARRealpath + " " + fileName;
    Runtime rt = Runtime.getRuntime();
    Process p = rt.exec(exec);
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "gbk"));
    String line;
    while ((line = br.readLine()) != null) {
    //System.out.println(line);
    }

    br = new BufferedReader(new InputStreamReader(p.getErrorStream(), "gbk"));
    while ((line = br.readLine()) != null) {
    //System.err.println(line);
    }
    // 当前线程等待该process结束,既挂起主线程

    p.waitFor();
    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建