热门搜索 :
考研考公
您的当前位置:首页正文

java 实现压缩与解压缩ZIP

来源:东饰资讯网


压缩的

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

public class Zip {

static final int BUFFER = 2048;

public static void main(String argv[]) {

try {

BufferedInputStream origin = null;

FileOutputStream dest = new FileOutputStream(\"E:\\\est\\\\myfiles.zip\");

ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(

dest));

byte data[] = new byte[BUFFER];

File f = new File(\"e:\\\est\\\\a\\\\\");

File files[] = f.listFiles();

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

FileInputStream fi = new FileInputStream(files[i]);

origin = new BufferedInputStream(fi, BUFFER);

ZipEntry entry = new ZipEntry(files[i].getName());

out.putNextEntry(entry);

int count;

while ((count = origin.read(data, 0, BUFFER)) != -1) {

out.write(data, 0, count);

}

origin.close();

}

out.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

2,解压缩的。

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.util.Enumeration;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

public class UnZip {

static final int BUFFER = 2048;

public static void main(String argv[]) {

try {

String fileName = \"E:\\\est\\\\myfiles.zip\";

String filePath = \"E:\\\est\\\\\";

ZipFile zipFile = new ZipFile(fileName);

Enumeration emu = zipFile.entries();

int i=0;

while(emu.hasMoreElements()){

ZipEntry entry = (ZipEntry)emu.nextElement();

//会把目录作为一个file读出一次,所以只建立目录就可以,之下的文件还会被迭代到。

if (entry.isDirectory())

{

new File(filePath + entry.getName()).mkdirs();

continue;

}

BufferedInputStream bis = new BufferedInputStream(zipFile.getIn

putStream(entry));

File file = new File(filePath + entry.getName());

//加入这个的原因是zipfile读取文件是随机读取的,这就造成可能先读取一个文件

//而这个文件所在的目录还没有出现过,所以要建出目录来。

File parent = file.getParentFile();

if(parent != null && (!parent.exists())){

parent.mkdirs();

}

FileOutputStream fos = new FileOutputStream(file);

BufferedOutputStream bos = new BufferedOutputStream(fos,BUFFER);

int count;

byte data[] = new byte[BUFFER];

while ((count = bis.read(data, 0, BUFFER)) != -1)

{

bos.write(data, 0, count);

}

bos.flush();

bos.close();

bis.close();

}

zipFile.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

偶尔一次,遇到这样一个问题,要求对zip文件进行解压缩,并读取压缩包中.txt和.inf文件的数据,经过jdk Helper 和 Google才将问题得以解决。这里只写了解压过程,在main方法中压缩包存放路径和解压到目标的文件已经硬编码进去了。程序整体结构不是很令人

满意,仍然需要重构.......

package com.da.unzip;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.Reader;

import java.nio.ByteBuffer;

import java.util.ArrayList;

import java.util.Enumeration;

import java.util.List;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

public class Unzip {

public static void main(String args) throws Exception {

Unzip unzip = new Unzip();

String zippath = \"C:\\\\\\\\";// /解压到的目标文件路径

String zipDir = \"C:\\\\data\\\\\";// 要解压的压缩文件的存放路径

File file = new File(zipDir);

List list = unzip.getSubFiles(file);

for (Object obj : list) {

String realname = ((File)obj).getName();

System.out.println(realname);

int end = realname.lastIndexOf(\".\");

System.out.println(\"要解压缩的文件名..........\"+zipDir+realname);

System.out.println(\"解压到的目录\" +zippath+realname.substring(0, end));

unzip.testReadZip(zippath,zipDir+realname);

}

}

/*

* 解压缩功能. 将zippath目录文件解压到unzipPath目录下. @throws Exception

*/

public void ReadZip(String zippath, String unzipPath) throws Exception {

ZipFile zfile = new ZipFile(unzipPath);// 生成一个zip文件对象

System.out.println(zfile.getName());// 获取要解压的zip的文件名全路径

Enumeration zList = zfile.entries();// 返回枚举对象

ZipEntry ze = null;// 用于表示 ZIP 文件条目

byte buf = new byte[1024];// 声明字节数组

/**

* 循环获取zip文件中的每一个文件

*/

while (zList.hasMoreElements()) {

// 从ZipFile中得到一个ZipEntry

ze = (ZipEntry) zList.nextElement();

if (ze.isDirectory())// 如果为目录条目,则返回 true,执行下列语句

{

System.out.println(\"Dir: \" + ze.getName() + \" skipped..\");

continue;

}

int begin = zfile.getName().lastIndexOf(\"\\\\\") + 1;

int end = zfile.getName().lastIndexOf(\".\");

String zipRealName = zfile.getName().substring(begin, end);

System.out.println(\"解压缩开始

Extracting:\"+ze.getName()+\"\\"+ze.getSize()+\"\\"+ze.getCompressedSize());

// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中,并加上缓冲

OutputStream os = new BufferedOutputStream(

new FileOutputStream(getRealFileName(zippath + \"\\\\\"

+ zipRealName, ze.getName())));

InputStream is = new BufferedInputStream(zfile.getInputStream(ze));

String fileName = getRealFileName(zippath, ze.getName()).getName();

System.out.println(\"解压出的文件名称:\" + fileName);

int readLen = 0;

while ((readLen = is.read(buf, 0, 1024)) != -1) {

os.write(buf, 0, readLen);

}

is.close();

os.close();

// System.out.println(\"解压缩结束Extracted: \"+ze.getName());

}

zfile.close();

}

/**

* 给定根目录,返回一个相对路径所对应的实际文件名.

*

* @param zippath

* 指定根目录

* @param absFileName

* 相对路径名,来自于ZipEntry中的name

* @return java.io.File 实际的文件

*/

private File getRealFileName(String zippath, String absFileName) {

String dirs = absFileName.split(\"/\

File ret = new File(zippath);// 创建文件对象

if (dirs.length > 1) {

for (int i = 0; i < dirs.length - 1; i++) {

ret = new File(ret, dirs[i]);

}

}

if (!ret.exists()) {// 检测文件是否存在

ret.mkdirs();// 创建此抽象路径名指定的目录

}

ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child

// 路径名字符串创建一个新 File 实例

return ret;

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top