热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Java项目中解压7Zip特殊压缩算法文件

1问题描述 JavaWeb后端下载了一个经特殊算法压缩的zip文件,因为不能采用java本身自带的解压方式,必须采用7Zip来解压。所以,提到了本文中在javaweb后端调用外部7zipexe来解压文件的问题。2主要实现 2.1定义缓冲区类 classS

1 问题描述 


Java Web 后端下载了一个经特殊算法压缩的 zip 文件,因为不能采用 java 本身自带的解压方式,必须采用 7Zip 来解压。所以,提到了本文中在 java web 后端调用外部 7zip exe 来解压文件的问题。


2 主要实现 

2.1 定义缓冲区类 

class StreamGobbler extends Thread {
    InputStream is;
    String type;
    
    public StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
    }
    
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ((line = br.readLine()) != null) {
                System.out.println(type + ">" + line);
            }
        } catch (IOException ioe){
            ioe.printStackTrace();  
        }
    }
}

2.2 执行外部 exe 流程 

String[] cmd = {
    "7za.exe",
    "x",
    zipPath,
    "-o" + outputPath
};


Runtime rt = Runtime.getRuntime();  
Process proc = rt.exec(cmd);  


// 监听出错信息
StreamGobbler errorGobbler = new 
    StreamGobbler(proc.getErrorStream(), "ERROR");            


// 监听输出信息
StreamGobbler outputGobbler = new 
    StreamGobbler(proc.getInputStream(), "OUTPUT");
    
// 启动监听输入
errorGobbler.start();
outputGobbler.start();


// 确保 Runtime.exec 进程执行完毕
int exitVal = proc.waitFor();
System.out.println("ExitValue: " + exitVal);



3 重点解决 

3.1 Process.waitFor 在 tomcat 中执行时,卡死状态 

3.1.1 问题原因 

一定要在调用Process.waitFor()前将程序的stdout和stderr都读完,否则就有可能因为pipe的缓冲区不够,被调用的系统命令阻塞在标准输出和标准错误输出上。Windows因为这个缓冲区的默认值比较小更容易出现这个问题。


需要注意读取程序的stdout和stderr都是阻塞的操作,这意味着必须在两个线程里分别读取,而不是在一个线程里一次读取,否则还是有可能出现阻塞的情况。


[http://www.dongliu.net/post/496142]


3.1.2 其他猜测 

1. 程序主进程会等待process一定的时间,但是时间很少,可能process根本无法完成工作就结束了。 因此,针对使用较长时间做工作的process,就需要调用waitFor方法。 该方法会引起当前Thread等待,直到process中断。 [http://ccchhhlll1988-163-com.iteye.com/blog/1901497]


2. 可能是因为在 tomcat 中启动了一个进程,但是没有权限来杀死这个进程,所以,一直卡在这个界面


4 其他 


4.1 用 Java 自带的解压库 


java.util.zip


由于算法不一致,解压时提示: “invalid CEN header(bad compression method)”


4.2 下载 7Zip 的解压库 


在 sourceforge 网站下载 sevenzipjbinding 压缩包。而且下载的也不是打包好的压缩文件


但是由于不支持最新的解压算法取消。


4.3 tomcat 下是否有调用外部 exe 的权限 


4.4 启动tomcat失败 


服务器能够正常启动项目,但是本地电脑不能启动。提示信息: "org.apache.catalina.LifecycleException: Failed to start component"


当本地 tomcat6 测试调用外部 exe 成功之后,就考虑在实际项目中测试项目是否成功,实际项目中用的是 tomcat7,同时包含了相应的 jdk 文件夹,进行了一定的改装。比如:修改了存放 webapp 的文件夹路径等;删除了一些不必要的文件等;


发现最终原因是因为: 启动时使用了本地较低版本的 jdk,设置 JAVA_HOME 为打包自带的 jdk 文件夹即可。


5 参考资料 


1. runtime.getruntime.exec 中 waitfor 的用法

程序设计时,有时候需要在等待调用的系统程序完成操作后,当前线程才能做下一步操作,此时可以用类Process的方法waitFor()来实现,它会阻塞当先线程直至调用程序运行结束。



2. 正确的调用系统命令——为Process.waitFor设置超时以及其他

所以在代码中加入超时控制是必须的。但是Process.waitFor()本身并不支持超时时间设置,
一个方法是改用非阻塞的Process.exitValue()方法,然后轮询检查进程状态,这种方式比较消耗CPU,以至于轮询间隔也不能设置得太小,总归不是很完美。
另外就是另起一个线程来调用程序,在主线程中发现超时的时候,直接调用process.destroy()终止进程。

3. When Runtime.exec() won't
介绍为什么不能正常执行 Runtime 函数




推荐阅读
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
author-avatar
身强体硕之大家来锻炼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有