Java Zip压缩
1.压缩文件或整个目录
// ZipCompression.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipCompression {
private String mFileDest;
private ZipOutputStream mZipOutputStream;
private static final String SEPARATOR = File.separator;
// public static void main(String[] args) {
//
// // ZipCompress zipCompress = new ZipCompress("E:\\1.zip");
// ZipCompression zip = new ZipCompression("1.zip");
// zip.add("1.txt");
// zip.add(".");
// zip.add("2.txt");
// zip.close();
// }
/**
* @param pathname
* zip目标文件的名字
*/
public ZipCompression(String pathname) {
mFileDest = new File(pathname).getAbsolutePath();
FileOutputStream fos;
try {
fos = new FileOutputStream(mFileDest, true);
mZipOutputStream = new ZipOutputStream(fos);
} catch (FileNotFoundException e) {
printStackTrace(e);
}
}
/**
* 关闭zip文件,结束打包.
*/
public void close() {
if (mZipOutputStream != null) {
try {
mZipOutputStream.close();
} catch (IOException e) {
printStackTrace(e);
}
mZipOutputStream = null;
}
}
/**
* 添加一个文件或目录到zip文件
*
* @param filePath
* 待压缩的文件或目录,可以是相对目录
*/
public void add(String filePath) {
try {
File file = new File(filePath);
String path = "";
if (file.isDirectory()) {
filePath = file.getAbsolutePath();
if (filePath.endsWith("."))
filePath = filePath.substring(0, filePath.length() - 1);
if (filePath.endsWith(SEPARATOR))
filePath = filePath.substring(0, filePath.length() - 1);
// System.out.println("filePath:" + filePath);
int pos = filePath.lastIndexOf(SEPARATOR);
// System.out.println(filePath.substring(0, pos));
if (filePath.substring(0, pos).contains(SEPARATOR))
path = filePath.substring(pos + 1, filePath.length())
+ SEPARATOR;
// System.out.println("path:" + path);
}
byte[] buffer = new byte[1024];
add(mZipOutputStream, path, filePath, buffer);
} catch (Exception e) {
printStackTrace(e);
}
}
/**
* 添加一个文件或目录到zip文件,如果是目录则递归打包子目录
*
* @param zos
* zip压缩的目标文件
* @param path
* 待创建的zip文件夹内的相内路径
* @param file
* 待压缩的文件或目录的路径
* @param buffer
* 数据临时缓冲区
*/
private void add(ZipOutputStream zos, String path, String file,
byte[] buffer) {
try {
File inputFile = new File(file);
if (inputFile.isFile()) {
add(zos, path, inputFile, buffer);
} else if (inputFile.isDirectory()) {
// System.out.println("add dir:" + inputFile.getName());
for (File subFile : inputFile.listFiles()) {
if (subFile.isDirectory()) {
String newPath = path + subFile.getName() + SEPARATOR;
add(zos, newPath, subFile.getPath(), buffer);
} else {
add(zos, path, subFile, buffer);
}
}
}
} catch (Exception e) {
printStackTrace(e);
}
}
/**
* 添加一个已打开的文件到zip中
*
* @param zos
* zip压缩的目标文件
* @param path
* 待创建的zip文件夹内的相内路径
* @param file
* 待压缩的文件
* @param buffer
* 数据临时缓冲区
*/
private void add(ZipOutputStream zos, String path, File file, byte[] buffer) {
FileInputStream fis = null;
try {
path.equalsIgnoreCase("");
// 防止将目标zip文件打包进自己的压缩包内
String src = file.getAbsolutePath();
// System.out.println("src:" + src);
if (mFileDest.equalsIgnoreCase(src)) {
// System.out.println("Error! It's dest file! " + src);
return;
}
int ret;
try {
ZipEntry zipEntry = new ZipEntry(path + file.getName());
zos.putNextEntry(zipEntry);
FileInputStream fin = new FileInputStream(file);
while ((ret = fin.read(buffer)) != -1) {
zos.write(buffer, 0, ret);
}
fin.close();
zos.closeEntry();
} catch (Exception e) {
printStackTrace(e);
}
} catch (Exception e) {
printStackTrace(e);
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException e) {
printStackTrace(e);
}
}
}
private void printStackTrace(Exception exception) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
System.out.print(sw.toString());
// e.printStackTrace();
}
}
2.解压一个zip文件到指定的目录
// ZipDecompression.java
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class ZipDecompression {
private final String mZipFile;
private final String mDestPath;
public static void main(String[] args) {
ZipDecompression unzip = new ZipDecompression("e:\\2.zip", "E:\\2\\");
unzip.start();
}
public ZipDecompression(String zip, String destPath) {
mZipFile = zip;
mDestPath = destPath;
}
/**
* 开始解压缩zip
*
* @return 成功返回true,出现任何错误返回false
*/
public boolean start() {
byte[] buffer = new byte[1024];
int ret = 0;
try {
ZipFile zipFile = new ZipFile(mZipFile);
Enumeration<? extends ZipEntry> entries = zipFile.entries();
ZipEntry entry;
String name;
InputStream fis;
FileOutputStream fos;
while (entries.hasMoreElements()) {
entry = entries.nextElement();
name = mDestPath + entry.getName();
name = name.replaceAll("\\*", "/"); // 替换会出现不成功!
// System.out.println("\n" + name);
mkdirs(name);
fos = new FileOutputStream(name);
fis = zipFile.getInputStream(entry);
do {
ret = fis.read(buffer);
if (ret == -1)
break;
fos.write(buffer, 0, ret);
} while (true);
fis.close();
fos.close();
}
} catch (FileNotFoundException e) {
printStackTrace(e);
return false;
} catch (IOException e) {
printStackTrace(e);
return false;
} catch (Exception e) {
printStackTrace(e);
return false;
}
return true;
}
/**
* 递归创建目录
*
* @param pathname
* 文件或目录名称
*/
private void mkdirs(String pathname) {
try {
File file = new File(pathname);
if (!file.isDirectory()) {
for (int i = pathname.length() - 1; i >= 0; i--) {
Character c = pathname.charAt(i);
if (c.equals('\\') || c.equals('/')) {
String newPath = pathname.substring(0, i);
// System.out.println(newPath);
file = new File(newPath);
break;
}
}
}
if (!file.exists())
file.mkdirs();
} catch (Exception e) {
printStackTrace(e);
}
}
private static void printStackTrace(Exception exception) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
System.out.print(sw.toString());
// e.printStackTrace();
}
}
Java Zip压缩的更多相关文章
- java ZIP压缩文件
问题描述: 使用java ZIP压缩文件和目录 问题解决: (1)单个文件压缩 注: 以上是实现单个文件写入压缩包的代码,注意其中主要是在ZipOutStream流对象中创建Z ...
- java zip 压缩文件
zip压缩:ZipOutputStream.ZipFile.ZipInputStream 三个类的作用 一段 java zip 压缩的代码: File dir = new File("C ...
- java zip 压缩与解压
java zip 压缩与解压 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java. ...
- Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)
Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 学习了:http://www.tuicool.com/articles/V7BBvy 引用原文: JDK中自带的ZipOutputStrea ...
- Java Zip压缩实现
最近在自学javaWeb,先复习一下java,把还给老师的东西再找回来(知识如果不用很快就会忘记啊).. 今天看到了zip压缩,决定要整理一下. java将有关zip压缩的内容都封装在java.uti ...
- Java zip 压缩 文件夹删除,移动,重命名,复制
FileUtil.java import java.io.*; import java.util.List; import java.util.zip.ZipEntry; import java.ut ...
- Java ZIP压缩和解压缩文件并兼容linux
JDK中自带的ZipOutputStream在压缩文件时,如果文件名中有中文,则压缩后的 zip文件打开时发现中文文件名变成乱码. 解决的方法是使用apache-ant-zip.jar包(见附件)中的 ...
- java zip压缩优化版 解决压缩后文件一直被占用无法删除
最近进行zip操作,从网上找到一个处理方法,但是经过试验存在一些bug,主要是文件流的申明存在问题,导致jvm一直占用文件而不释放,特意把自己修改的发出来,已备记录 import java.io.Bu ...
- java zip压缩文件和文件夹
public class FileUtil { /** * 压缩文件-File * @param out zip流 * @param srcFiles 要压缩的文件 * @param path 相对路 ...
随机推荐
- Java 消息对列
ActiveMQ入门实例 1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5. ...
- 孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解
孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解 (今天由于文中所阐述的原因没有进行屏幕录屏,见谅) 为了能够使用selenium模块进行真正的操作,今天主要大范围搜索资料进行 ...
- Centos7下部署activeMQ消息队列服务
#1.下载activeMQlinux包 http://activemq.apache.org/activemq-5100-release.html 下载linux的activeMQ包 #2.使用X ...
- NOIP2019普及级别模拟 3.30校模拟
好吧我还是第一次写这种总结类的玩意… 考场心情…hmm…我没睡醒.是的是这样的,反正题都有两三个看错了或者没看懂… 最关键的是!!我!居!然!把!Freopen!写!在!了!程!序!最!后! 然后就和 ...
- leetcode个人题解——#19 Remove Nth Node From End of List
思路:设置两个指针,其中第二个指针比第一个延迟n个元素,这样,当第二个指针遍历到指针尾部时,对第一个指针进行删除操作. 当然,这题要注意一些边界值,比如输入[1,2] n=2时如果按照思路走会指向未分 ...
- 从wait_type入手模拟SQL Server Lock
一.LCK_M_S,等待获取共享锁 开始一SQL TRAN,其中执行对某数据的UPDATE.但并不COMMIT,也不ROLLBACK. begin tran update [dbo].[HR_Empl ...
- CDH组件目录\主机资源分配\端口
目录: /var/log/cloudera-scm-installer : 安装日志目录. /var/log/* : 相关日志文件(相关服务的及CM的). /usr/share/cmf/ : 程序安装 ...
- es6从零学习(二):promise
es6从零学习(二):promise 一:promise的由来 某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称——回调地狱.由此,Promise的概念就由社区 ...
- “Hello World!”团队召开的第十二次会议
今天是我们团队“Hello World!”团队召开的第十二次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 2 ...
- (转)apktool+dex2jar+jd_gui
转:http://www.cnblogs.com/MichaelGuan/archive/2011/10/25/2224578.html apktool: 可以解析资源文件,比如布局文件xml等,方便 ...