压缩流:
ZipInputStream(解压),ZipOutoutStream(压缩)来现实Zip的压缩和解压功能。
菜鸟编的代码,有大虾发现不足之处请多多包含~~
package com.shilei.io.解压缩文件;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
* 文件的解压缩
* @author shilei
* @category
* @date 2013-4-16
* @time 下午08:29:12
* @version
*/
public class ZipStreamDemo2 {
/**
* 压缩文件
* @param file 要解压的文件对象
* @param zipFile 压缩到的路径
*/
private static String path;
private static String zipoutpath;
public static void zipmethod(File file, String zipFileName)
throws Exception {
ZipOutputStream zos = null;
path = file.getAbsolutePath();
// System.out.println("path:"+path);
// 判断文件是否文件夹
if (!file.isDirectory()) {
System.out.println(file.getName() + ":不是文件夹");
return;
} else {
// 获得文件对象的集合
File[] files = file.listFiles();
if (zos == null) {// ZIP输出流为空则创建新的ZIP输出流
FileOutputStream fos = new FileOutputStream(zipFileName);// 创建压缩文件的输出流对象
zos = new ZipOutputStream(fos);// 创建新的ZIP输出流
}
readDir(file, zos);
zos.close();
}
System.out.println("压缩完成...");
}
/**
*
* @param fileDir 要压缩的文件对象
* @param zipOut压缩的ZIP输出流
* @throws Exception
*/
private static void readDir(File fileDir, ZipOutputStream zipOut)
throws Exception {
// 获得文件内的集合
File[] files = fileDir.listFiles();
String entryDir;
for (File tempfile : files) {
if (tempfile.isDirectory())// 是文件夹则递归
{
readDir(tempfile, zipOut);
} else {
// 读文件将数据写到压缩包中
FileInputStream fis = new FileInputStream(tempfile);
BufferedInputStream bis = new BufferedInputStream(fis);
// 构建一个压缩条目,和文件名同名
entryDir = tempfile.getAbsolutePath().substring(
path.indexOf(':') + 2);
// System.out.println(entryDir+"-----"+path);
ZipEntry entry = new ZipEntry(entryDir);
// 向压缩包中放入一个压缩条目
zipOut.putNextEntry(entry);
byte[] contents = new byte[1024];
int end = -1;
while ((end = bis.read(contents)) != -1) {
// 将读到的数据写到压缩包中相应的条目
zipOut.write(contents, 0, end);
zipOut.flush();
}
bis.close();
}
}
}
/**
* 解压文件
*
* @param file
* 指定解压文件的目录
* @param zipFilePath
* 要解压的文件的目录
*/
public static void unZipFile(File file, String zipFilePath)
throws Exception {
zipoutpath = file.getAbsolutePath();
// System.out.println("zipoutpath:"+zipoutpath);
// 定义压缩文件
ZipFile zipFile = new ZipFile(zipFilePath);
// 获得压缩文件的所有目录
Enumeration entries = zipFile.entries();
// 判断目标文件夹是否存在
if (!file.exists()) {
file.mkdirs();
}
while (entries.hasMoreElements()) { // 获得压缩条目的输入流
ZipEntry entry = (ZipEntry) entries.nextElement();
InputStream fis = zipFile.getInputStream(entry);
BufferedInputStream bis = new BufferedInputStream(fis);
// 写文件
String filepath = zipoutpath.substring(0, 2) + "\\"
+ entry.getName();// 建立一个与压缩条目相同的路径
filepath = new String(filepath.getBytes("UTF-8"));
File _file = new File(filepath);// 将路径转化为文件
// System.out.println("_file:"+_file.getAbsolutePath()+" **** entry:"+entry.getName());
if (entry.isDirectory()) {// 是文件夹就创建文件目录
System.out.println("entry: " + entry.getName());
_file.mkdirs();
} else {
// System.out.println(_file.getParentFile().toString()+"----"+_file.toString());
// 指定文件的目录不存在,则创建(即该文件的父文件夹)
if (!_file.getParentFile().exists()) {
_file.getParentFile().mkdirs();
}
// 获得输出流
FileOutputStream fos = new FileOutputStream(_file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] values = new byte[1024];
int end = -1;
while ((end = bis.read(values)) != -1) {
bos.write(values, 0, end);
bos.flush();
}
bos.close();
bis.close();
}
}
System.out.println("解压完成...");
}
public static void main(String[] args) {
try {
System.out.println("请选择你的操作:\n1.压缩文件\n2.解压文件");
Scanner in = new Scanner(System.in);
int operNum = in.nextInt();
switch (operNum) {
case 1:
System.out.println("请输入要压缩的文件:");
String dir = in.next();
zipmethod(new File(dir), dir + ".zip");// 压缩
break;
case 2:
System.out.println("请输入要解压的文件:");
String undir = in.next();
// System.out.println(undir.substring(0, undir.indexOf('.')));
unZipFile(new File(undir.substring(0, undir.indexOf('.'))),
undir);// 解压
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}