java文件解压文件_java 文件解压缩

直接上代码:

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Enumeration;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

import java.util.zip.ZipOutputStream;

/*

* 对特定文件进行解压缩

*/

public class ZipAndUnZipUtil {

private ZipAndUnZipUtil() {

}

private static ZipAndUnZipUtil zipSingleInstance;

/*

* 生成实例

*/

public static ZipAndUnZipUtil getInstance() {

if (null == zipSingleInstance) {

zipSingleInstance= new ZipAndUnZipUtil();

}

return zipSingleInstance;

}

/*

* 解压文件

* @param srcPath 源压缩包路径

* @param despath 解压后存储的目录

* @return 解压后存储的路径目录

*/

@SuppressWarnings("unchecked")

public String unZip(String srcPath, String desPath) {

if ("".equals(srcPath) || null == srcPath) {

System.out.println("解压的文件的路径为空");

return null;

}

if ("".equals(srcPath) || null == desPath) {

System.out.println("文件解压后存储路径为");

return null;

}

File srcFile = new File(srcPath);

File desFile = new File(desPath);

//创建指定目录,如果其不存在的情况下

if (!desFile.exists()) {

if (!desFile.mkdirs()) {

System.out.println("指定目录创建失败");

return null;

}

}

try {

//读取zip文件

ZipFile zipTest = new ZipFile(srcFile);

Enumeration entries = (Enumeration) zipTest

.entries();

ZipEntry entry = null;

while (entries.hasMoreElements()) {

entry = entries.nextElement();

if (entry.isDirectory()) {

//创建目录

File dirFile=new File(desPath+File.separator+entry.getName());

dirFile.mkdirs();

} else {

//解压文件

BufferedInputStream inputStream = new BufferedInputStream(zipTest.getInputStream(entry));

BufferedOutputStream out =new BufferedOutputStream( new FileOutputStream(desPath+File.separator+entry.getName()));

byte[] bytes=new byte[2*1024];

int count;

while((count=inputStream.read(bytes))!=-1){

out.write(bytes, 0, count);

}

inputStream.close();

out.close();

}

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return desPath;

}

/*

* 压缩文件

*

* @param srcPath 需要压缩的文件路径

* @param despath 压缩文件的存储目录

* @param name 文件名字

* @return desPath 压缩文件结果的存储路径,如果输入路径为空,或者存储路径已经存在,则返回null,

*/

public String zipDocuments(String srcPath, String desPath,String name) {

if ("".equals(srcPath) || null == srcPath) {

System.out.println("压缩的文件的路径为空");

return null;

}

if ("".equals(srcPath) || null == desPath) {

System.out.println("压缩文件的存储路径为");

return null;

}

File srcFile = new File(srcPath);

File desFile = new File(desPath);

// 判断目标目录是否存在,如果不存在就创建

if (!desFile.exists()) {

if (!desFile.mkdirs()) {

System.out.println("存储目录创建失败");

return null;

}

}

try {

ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(

desPath + File.separator + name));

int start = srcPath.lastIndexOf(srcFile.getName());

// 压缩文件

zipDirAndFile(srcFile, outZip, start);

outZip.close();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return desPath + File.separator + name;

}

/*

* 压缩文件及目录

*/

private void zipDirAndFile(File file, ZipOutputStream out, int start) {

if (null == file | null == out) {

throw new NullPointerException("文件或ZipOutputStream引用为空");

}

File[] files;

// 如果file对象是目录

if (file.isDirectory()) {

files = file.listFiles();

try {

// 生成压缩目录文件

String dirPath = file.getPath().substring(start);

out.putNextEntry(new ZipEntry(absToreDirPath(dirPath)));

out.closeEntry();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

for (File f : files) {

zipDirAndFile(f, out, start);

}

} else {

// 如果file对象时文件

BufferedInputStream inZip;

byte[] buff;

try {

inZip = new BufferedInputStream(new FileInputStream(file));

buff = new byte[5 * 1024];

ZipEntry zipEntry = new ZipEntry(new String(file.getPath()

.substring(start)));

out.putNextEntry(zipEntry);

int count;

while ((count = inZip.read(buff, 0, buff.length)) != -1) {

out.write(buff, 0, count);

}

inZip.close();

out.closeEntry();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

/*

* 路径转换成相对路径 start:相对路径起始的位置

*/

private String absToreDirPath(String absPath) {

char[] pathChars = absPath.toCharArray();

for (int i = 0; i < pathChars.length; i++) {

if (File.separatorChar == pathChars[i]) {

pathChars[i] = '/';

}

}

return new String(pathChars) + "/";

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 遍历Map对象

方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 Map<Integer, Integer> map new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println("Key " …

sol - 0x60,61,62

[例题]走廊泼水节 设当前扫描到边x,y&#xff0c;长度为z&#xff0c;x所处的并查集为Sx&#xff0c;y所处的并查集为Sy&#xff1b; 对于任意u属于Sx&#xff0c;v属于Sy&#xff0c;我们可以知道u&#xff0c;v之间必连一条边 但是我们要在保证x,y之间的边属于唯一最小生成树…

将Spring Bean注入非托管对象

依赖注入带来的好处可能会上瘾。 使用注入配置应用程序结构比手动完成所有解析要容易得多。 当我们有一些在容器外部实例化的非托管类时&#xff0c;例如在Vaadin UI组件或JPA实体等其他框架中&#xff0c;它们是很难被退出的。 当我们使用域驱动设计时&#xff0c;后者尤其重要…

java 编程原理_Java网络编程 -- 网络编程基础原理

Hello&#xff0c;今天记录下 Java网络编程 --> 网络编程基础原理。一起学习&#xff0c;一起进步。继续沉淀&#xff0c;慢慢强大。希望这文章对您有帮助。若有写的不好的地方&#xff0c;欢迎评论给建议哈&#xff01;初写博客不久&#xff0c;我是杨展浩。这是我的第十五…

JavaScript基础之--- 深拷贝与浅拷贝

理解深拷贝和浅拷贝之前&#xff0c;先来看一下JavaScript的数据类型。 1、基本类型和引用类型 //案例1 var num1 1, num2 num1; console.log(num1) //1 console.log(num2) //1 num2 2; //修改num2 console.log(num1) //1 console.log(num2) //2 //案例2 var obj1 {x: 1, …

vue菜鸟从业记:完成项目最后一公里之真机测试和打包上线

最近我朋友王小闰他们公司的项目开发已经进入收尾阶段&#xff0c;前后端并行开发的差不多了&#xff0c;联调也调过了&#xff0c;上篇文章里也讲到了&#xff0c;所谓联调&#xff0c;就仿佛在说“我也不知道我的接口文档写的对不对&#xff0c;我们验证一下吧&#xff1f;我…

血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息

在JavaScript文件中存储敏感数据&#xff0c;不仅是一种错误的实践方式&#xff0c;而且还是一种非常危险的行为&#xff0c;长期以来大家都知道这一点。 而原因也非常简单&#xff0c;我们可以假设你为你的用户动态生成了一个包含API密钥的JavaScript文件&#xff1a; apiCall…

使用Infinispan进行Camel的事务性缓存

不久前&#xff0c;我为Camel 创建了Redis连接器。 Redis是很棒的键值存储&#xff08;还有更多&#xff09;&#xff0c;但是随后我需要一个在与Camel相同的JVM中运行的缓存&#xff0c;并注意到Infinispan已切换到ASL v2 。 Camel中已经有其他用于在JVM上进行缓存的连接器&am…

“景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)...

题目链接&#xff1a;https://www.nowcoder.com/acm/contest/94/A 题意&#xff1a;在一个二维平面上有 n 个炸弹&#xff0c;每个炸弹有一个坐标和爆炸半径&#xff0c;引爆它之后在其半径范围内的炸弹也会爆炸&#xff0c;每个炸弹最多爆炸一次&#xff0c;每次随机选一个未引…

java 日期是否合法_检测日期字符串是否为合法(java版)

1 /**2 * 检测日期字符串是否为合法3 *paramdateStr4 *paramformat5 *return6 */7 public static final boolean checkDateFormat(String dateStr,String format) throwsNumberFormatException{8 if(dateStr null || "".equals(dateStr) ) return false;9 if(dateSt…

从零开始搭建一个vue.js的脚手架

在谷歌工作的时候&#xff0c;我们要做很多界面的原型&#xff0c;要求快速上手&#xff0c;灵活运用&#xff0c;当时用的一些现有框架&#xff0c;比如angular&#xff0c;太笨重了——尤雨溪&#xff08;Vue.js 作者&#xff09; vue.js是现在一个很火的前端框架&#xff0c…

更安全的Web通信HTTPS

1. HTTP协议存在的问题 阅读本篇需要对HTTP协议有最基本的了解。 借用《图解密码技术》里的图片&#xff0c;我们以如下一个购物场景开始介绍&#xff1a; 在网购过程中&#xff0c;如果使用纯粹的HTTP协议&#xff0c;那么用户的账号密码&#xff0c;信用卡&#xff0c;银行卡…

Java中的Memento设计模式-示例教程

记忆模式是行为设计模式之一 。 当我们要保存对象的状态以便以后可以恢复时&#xff0c;可以使用Memento设计模式。 记忆模式用于以这种方式实现该目的&#xff0c;即在对象外部无法访问该对象的已保存状态数据&#xff0c;从而保护了已保存状态数据的完整性。 Memento模式通过…

CSS入门指南——页面的水平居中

我们经常看到这样的网页&#xff0c;即内容水平居中在屏幕中间&#xff0c;左右留白。我们来给这样的布局起个名字——水平居中布局 其实要实现这样的布局十分简单&#xff0c;即给中间部分一个宽度&#xff0c;设置margin左右值为auto,如&#xff0c;中间部分class"main&…

python控制台执行代码字符串_编写Python脚本以使用控制台命令执行

研究是在底部&#xff0c;阅读之前。。。谢谢。在我必须编写一个运行SQL查询的Python脚本。我创建了一个主类&#xff0c;名为SQLQuery。每个SQLQuery实例表示一个查询。脚本的结构必须如下所示&#xff1a;class SQLQuery(object):def __init___(self, string_myQuery)...inst…

Linux Tools Quick Tutorial 学习记录

总体 书籍链接 find命令 查找大于多少的文件 find / -type f -size 5M | xargs ls -lh | awk {print $5, $9} | ls -lrt

mysql explain的使用

一、explain返回各列的含义&#xff1a; 1、table&#xff1a;显示这一行的数据是关于那张表的 2、type&#xff1a;重要的列&#xff0c;显示连接使用了何种类型&#xff0c;从最好到最差的连接类型为const、eq_reg、ref、range、index、ALL 3、possible_keys&#xff1a;显示…

使用 Canvas 生成公众号头图

熟悉“前端晚自修”的朋友们应该知道&#xff0c;我们每期的头图除了上面的文字随着每期变动以外&#xff0c;几乎是一模一样的&#xff08;因为太懒了~&#xff09;。这个头图虽然丑了一点&#xff0c;但是也还说的过去&#xff0c;毕竟是我倾尽毕生艺术细胞拼出来的&#xff…

通过快速Java和文件序列化加快速度

从Java的第一个版本开始&#xff0c;每天都有许多开发人员试图至少达到与C / C 一样好的性能。 JVM供应商正在通过实现一些新的JIT算法来尽力而为&#xff0c;但仍有许多工作要做&#xff0c;尤其是在我们如何使用Java方面。 例如&#xff0c;对象<->文件序列化有很多优…

Flask mysql 模版传参_Flask渲染Jinja2模板和传参

### Flask渲染Jinja2模板和传参&#xff1a;1. 如何渲染模板&#xff1a;* 模板放在templates文件夹下* 从flask中导入render_template函数。* 在视图函数中&#xff0c;使用render_template函数&#xff0c;渲染模板。注意&#xff1a;只需要填写模板的名字&#xff0c;不需要…