压缩与解压(1)

发表时间:2017-05-09 13:24:27 浏览量( 44 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

一、压缩简介

在平时使用windows操作系统时,压缩与解压都是经常性操作,不同的压缩算法对应不同的压缩格式,一般现在经常使用的压缩格式有.rar,.zip,.7z的压缩格式。

在java系统中,API提供了压缩与解压的工具类可以轻松完成压缩解压的任务,由于更像是工具类,因此这两组不同压缩格式的类被放在util工具集包中,它们看上去更像流类型:

java.util.zip.ZipInputStream/java.util.zip.ZipOutputStream

java.util.zip.GZIPInputStream/java.util.zip.GZIPOutputStream

以上的类都会InputStream和OutputStream进行进一步的修饰,压缩后的数据总是以字节的方式而不是字符的方式进行处理的。

二、ZIP的压缩和解压缩

ZIP是一种很常见的压缩形式,在java中要实现ZIP的压缩主要用到的是java.util.zip这个包里面的类。主要有ZipFile、 ZipOutputStream、ZipInputStream和ZipEntry几个类。ZipOutputStream是用来压缩文件 的,ZipInputStream和ZipFile是用来解压缩文件的,在压缩和解压缩的过程中,ZipEntry都会用到。在java的Zip压缩文件 中,每一个子文件都是一个ZipEntry对象。

1、压缩文件。我们先封装一个方法,实现吧目录下的所有文件压缩,然后在main方法中尝试压缩D:/abc目录的所有文件。代码如下:

  public class Zip {
	public static void zipFile(File inFile, ZipOutputStream zos, String dir)
			throws IOException {
		if (inFile.isDirectory()) {
			File[] files = inFile.listFiles();
			for (File file : files) {
				//如果是目录就递归的压缩
				zipFile(file, zos, dir + "\\" + inFile.getName());
			}
		} else {
			String entryName = null;
			if (dir!=null&&!dir.equals("")) {
				entryName = dir + "\\" + inFile.getName();
			} else {
				entryName = inFile.getName();
			}
			//把文件封装成为ZipEntry对象
			ZipEntry entry = new ZipEntry(entryName);
			//添加到ZipOutputStream对象中
			zos.putNextEntry(entry);
			
			InputStream is = new FileInputStream(inFile);
			int len = 0;
			while ((len = is.read()) != -1) {
				zos.write(len);
			}
			is.close();
		}

	}

}

然后在main方法中调用这个方法,代码如下:

public static void main(String[] args) {
		File inFile = new File("D:\\abc");
		ZipOutputStream zos;
		try {
			zos = new ZipOutputStream(new FileOutputStream("D:\\abc.zip"));
			zipFile(inFile, zos, "");
			zos.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

2、解压缩文件。封装方法如下:

public static void unZipFile(String zipFileName, String targetDir) {
		try {
			File file = new File(zipFileName);
			// 实例化ZipFile,每一个zip压缩文件都可以表示为一个ZipFile
			ZipFile zipFile = new ZipFile(file);
			// 实例化一个Zip压缩文件的ZipInputStream对象
			ZipInputStream zipInputStream = new ZipInputStream(
					new FileInputStream(file));

			ZipEntry zipEntry = null;
			// getNextEntry()方法依次拿到每一个ZipEntry对象
			while ((zipEntry = zipInputStream.getNextEntry()) != null) {
				String fileName = zipEntry.getName();
				File temp = new File(targetDir + fileName);
				if (!temp.getParentFile().exists()) {
					temp.getParentFile().mkdirs();
				}
				OutputStream os = new FileOutputStream(temp);
				// 通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流
				InputStream is = zipFile.getInputStream(zipEntry);
				int len = 0;
				while ((len = is.read()) != -1) {
					os.write(len);
				}
				os.close();
				is.close();
			}

			zipInputStream.close();
		} catch (ZipException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

修改main函数,注释原来的代码,调用解压缩文件。代码如下:

public static void main(String[] args) {
	unZipFile("D:\\abc.zip","c:\\");

}