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.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipTest {
static final int BUFFER = 2048;

public static void main(String argv[]) throws Exception{
read();
}

static void write() {
try {
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream("f:\\mm\\m.zip");
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
dest));
byte data[] = new byte[BUFFER];
File f = new File("f:\\mm");
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();
}
}

@SuppressWarnings("unchecked")
static void read() {
try {
String fileName = "f:/mm/mm.zip";
String filePath = "f:/mm/";
ZipFile zipFile = new ZipFile(fileName);

Enumeration emu = zipFile.entries();
while (emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();
// 会把目录作为一个file读出一次,所以只建立目录就可以,之下的文件还会被迭代到。
if (entry.isDirectory()) {
new File(filePath + entry.getName()).mkdirs();
continue;
}
BufferedInputStream bis = new BufferedInputStream(zipFile
.getInputStream(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();
}
}
}




//




import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;

import cn.llg.zip.ZipEntry;
import cn.llg.zip.ZipFile;
import cn.llg.zip.ZipOutputStream;


public class YsZipUtil {

static final int BUFFER = 2048;

/**
* 压缩文件/文件夹
* @param zipFileFullName 压缩后的ZIP文件的全路径名称
* @param inputFileFullName 需要压缩的文件/文件夹 全路径名称
* @throws Exception
*/
public static void zip(String zipFileFullName, String inputFileFullName) throws Exception {
File zip = new File(zipFileFullName);
File parentDir = zip.getParentFile();
char pathSeparator = File.pathSeparatorChar;
zip(zip, parentDir, new File[]{new File(inputFileFullName)}, pathSeparator);
}

/**
* Recursively zips a set of root entries into a zipfile, compressing the
* contents.
*
* @param zipFile target zip file.
* @param parentDir a directory containing source files to zip.
* @param sources an array of files and/or directories to zip.
* @param pathSeparator path separator for zip entries.
*
* @throws IOException
*/
public static void zip( File zipFile, File parentDir, File[] sources, char pathSeparator) throws IOException {

String stripPath = (parentDir != null) ? parentDir.getPath() : "";
if (stripPath.length() > 0 && !stripPath.endsWith(File.separator)) {
stripPath += File.separator;
}

ZipOutputStream out =
new ZipOutputStream(new FileOutputStream(zipFile));
out.setMethod(ZipOutputStream.DEFLATED);

try {
// something like an Ant directory scanner wouldn't hurt here
for (int i = 0; i < sources.length; i++) {
if (!sources[i].exists()) {
throw new IllegalArgumentException(
"File or directory does not exist: " + sources[i]);
}

if (sources[i].isDirectory()) {
zipDirectory(out, stripPath, sources[i], pathSeparator);
} else {
zipFile(out, stripPath, sources[i], pathSeparator);
}
}
} finally {
out.close();
}
}

/**
* Uses code fragments from Jakarta-Ant, Copyright: Apache Software
* Foundation.
*/
private static void zipDirectory(ZipOutputStream out, String stripPath, File dir, char pathSeparator) throws IOException {

String[] entries = dir.list();

if (entries == null || entries.length == 0) {
return;
}

// recurse via entries
for (int i = 0; i < entries.length; i++) {
File file = new File(dir, entries[i]);
if (file.isDirectory()) {
zipDirectory(out, stripPath, file, pathSeparator);
} else {
zipFile(out, stripPath, file, pathSeparator);
}
}
}

/**
* Uses code fragments from Jakarta-Ant, Copyright: Apache Software
* Foundation.
*/
private static void zipFile( ZipOutputStream out, String stripPath, File file, char pathSeparator) throws IOException {
ZipEntry ze =
new ZipEntry(processPath(file.getPath(), stripPath, pathSeparator));
ze.setTime(file.lastModified());
out.putNextEntry(ze);

byte[] buffer = new byte[2 * BUFFER];
BufferedInputStream in =
new BufferedInputStream(new FileInputStream(file), buffer.length);

try {
int count = 0;
while ((count = in.read(buffer, 0, buffer.length)) >= 0) {
if (count != 0) {
out.write(buffer, 0, count);
}
}
} finally {
in.close();
}
}

private static String processPath( String path, String stripPath, char pathSeparator) {
if (!path.startsWith(stripPath)) {
throw new IllegalArgumentException(
"Invalid entry: "
+ path
+ "; expected to start with "
+ stripPath);
}

return path.substring(stripPath.length()).replace(
File.separatorChar,
pathSeparator);
}

/**
* 解压缩文件
* @param zipFileName 压缩文件,全路径
* @param outputDirectory 解压缩到哪个目录
*/
public static void unzip(String zipFileName, String outputDirectory) {

try {

BufferedOutputStream dest = null;

BufferedInputStream is = null;

ZipEntry entry;

java.io.File f = new java.io.File(outputDirectory);
if (f.exists() == false) {
f.mkdirs();// 建立解压缩的目录
}

ZipFile zipfile = new ZipFile(zipFileName);

Enumeration<?> e = zipfile.getEntries();

while (e.hasMoreElements()) {

entry = (ZipEntry) e.nextElement();

System.out.println("Extracting: " + entry.getName());

if (entry.isDirectory()) {
File theDir = new File(outputDirectory + File.separator
+ entry.getName());
if (theDir.exists() == false) {
theDir.mkdirs();
}

} else {

File theFile = new File(outputDirectory + File.separator
+ entry.getName());
if (theFile.getParentFile().exists() == false) {
theFile.getParentFile().mkdirs();
}

is = new BufferedInputStream

(zipfile.getInputStream(entry));

int count;

byte data[] = new byte[BUFFER];

FileOutputStream fos = new

FileOutputStream(outputDirectory + File.separator
+ entry.getName());

dest = new

BufferedOutputStream(fos, BUFFER);

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

dest.write(data, 0, count);

}

dest.flush();

dest.close();

is.close();

}
}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String s[]){
try {
//压缩
// YsZipUtil.zip("e:\\model.zip", "e:\\复件java编写规范.doc");
//解压
YsZipUtil.unzip("f:/mm/mm.zip", "f:/mm/");
} catch (Exception e) {
e.printStackTrace();
System.out.print("zip failed!");
}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值