今天用到了ZIP,涉及多重打包解压zip
在网上搜了下。组要导入额外的jar包。不符合自己的要求,就自己写了个
实现把文件重复压缩两次(压缩文件里面还是压缩文件),主要是采用一个缓冲保存第一次压缩结果。然后再来压缩一次就可以了
压缩
package net.xf;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import com.sun.tools.javac.util.DefaultFileManager.Archive;
import sun.tools.tree.NewArrayExpression;
public class ZipArchive {
private static ZipArchive instance = new ZipArchive();
private String destPath;//压缩文件的存放位置
private String zipName;//压缩文件名
private ZipOutputStream zos;
public ZipArchive() {
this("C:\\zipArchive","test.zip");// 默认压缩到C盘下
}
public ZipArchive(String destPath,String zipName) {
this.destPath = destPath;
this.zipName=zipName;
init(this.zipName);
}
//更改zipName后应该重新初始化zos
private void init(String zipName) {
File file = new File(destPath);
if (!file.exists()) {
file.mkdir();
}
FileOutputStream dest = null;
try {
dest = new FileOutputStream(destPath + "\\\\" + zipName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 输出文件
BufferedOutputStream buffOut = new BufferedOutputStream(dest); // buffout用于压缩缓冲
zos = new ZipOutputStream(buffOut); // 用ZipOut包装buffOut,
}
public void setDestPath(String destPath) {
this.destPath = destPath;
}
public String getDestPath() {
return destPath;
}
public static ZipArchive getInstance() {
return instance;
}
private void archive(ByteArrayInputStream inputStream, String innerFileName) {
archive(zos, inputStream, innerFileName);
}
private void archive(ZipOutputStream zos, ByteArrayInputStream inputStream,
String innerFileName) {
try {
zos.putNextEntry(new ZipEntry(innerFileName));
int len;
while ((len = inputStream.read()) != -1) {
zos.write(len);
}
//zos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 压缩在压缩,
* @param inputStream 压缩的内容
* @param innerFileName 解压缩后文件名
* @param innerZipName 内层压缩的文件名
* @throws IOException
*/
private void doubleArchive(ByteArrayInputStream inputStream,
String innerFileName, String innerZipName) throws IOException {
// 因为是双重压缩,通过一个ByteArrayOutputStream的缓冲区实现
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
1024 * 1024);
ZipOutputStream tempOut = new ZipOutputStream(byteArrayOutputStream);
// 第一次压缩,压缩的结果放到xmlOut中
archive(tempOut, inputStream, innerFileName);
tempOut.flush();
tempOut.finish();
// 第二次压缩,压缩的结果放到最终输入的out中
archive(zos,
new ByteArrayInputStream(byteArrayOutputStream.toByteArray()),
innerZipName);
}
private void closeAll() throws IOException{
zos.flush();
zos.close();
}
public static void main(String[] args) throws IOException {
ZipArchive archive = ZipArchive.getInstance();
archive.archive(new ByteArrayInputStream("gannisdf".getBytes()), "sss.txt");
archive.doubleArchive(new ByteArrayInputStream("sdfsdfsdfgannisdfsdfsdfsdf".getBytes()), "sss.txt","shit.zip");
archive.closeAll();
}
}
分享到:
相关推荐
本文将深入探讨如何使用Java语言处理`.zip`格式的压缩文件,包括解压和删除文件目录及文件的操作。 首先,`.zip`是一种广泛使用的文件压缩格式,它允许我们将多个文件或目录打包成一个单一的文件,从而节省存储空间...
标题 "DH.tar.xz.zip" 暗示我们正在处理一个经过多重压缩的文件,它首先被归档为 .tar 文件,然后使用 .xz 压缩,最后又用 .zip 进行了封装。这样的组合可能是因为用户希望在不同环境下都能方便地解压,因为不同的...
- `-0`: 只存储方式,不使用ZIP压缩。 - `-M`: 不产生清单文件。 - `-i`: 为指定的jar文件产生索引信息。 - **示例**: - 将两个类文件打包到`classes.jar`中:`jar cvf classes.jar Foo.class Bar.class` - ...
1. **下载与解压**:首先,从可靠的来源下载`jdk-7-windows-i586.zip`,然后使用解压缩工具将其解压到一个方便的位置,例如"C:\Program Files"目录下。 2. **安装JDK**:解压后的文件`jdk-7-windows-i586.exe`是一...
"jdk1.7.0_67.zip" 是一个包含Java SE(标准版)7.0更新67版本的压缩包文件,特别适合那些在公司环境中没有权限直接安装JDK的开发者。这个版本发布于2014年,旨在提供稳定性和性能优化,同时也修复了一些已知的安全...
标题中的"ext-2.2.zip.tar.gz"表明这是一个经过多重压缩的文件,它首先是一个zip文件,然后被tar打包,最后用gzip进行了压缩。在Linux或Unix环境中,这种组合通常用于减小文件大小以便于网络传输或存储。解压这个...
".gz"是GNU Zip的压缩格式,它能有效地压缩文件,使其占用更少的磁盘空间。在Linux环境中,通常会先使用`tar`命令来解压`.tar`文件,然后使用`gzip`命令来解压`.gz`部分。 在标签为空的情况下,我们可以根据标题和...
- 解压缩下载的tar.gz文件,通常使用命令`tar -zxvf jdk1.7.0_55.tar.gz`。 - 将解压后的目录移动到系统路径如 `/usr/lib/jvm` 或者自定义位置。 - 配置环境变量,编辑`~/.bashrc`或`~/.bash_profile`,添加以下行:...
1. **解压文件**:使用`tar -zxvf php-5.4.17.tar.gz`命令解压缩文件。 2. **配置环境**:进入解压后的目录,然后运行`./configure`命令来检查系统环境并配置编译选项。 3. **编译源代码**:使用`make`命令来编译源...