Java压缩文件

    使用Java来压缩文件,主要用到2个类,一个是java.util.zip.ZipEntry一个是java.util.zip.ZipOutputStream,用的是Java自带的压缩类,自带的类不能设置编码,有时会出现乱码的现象,所以可以使用apache的压缩类,它的可以设置编码,由于用法差不多,所以这里讲的是Java自带的

    ZipOutputStream:代表了一个zip格式的输出流,操作与普通输出流一样

    ZipEntry:代表了zip文件中的一个目录

    下面这个程序就是简单的将一个文件压缩成zip格式的文件

	public static void main(String[] args) throws IOException {
		File srcFile = new File("F:\\test\\1.doc");
		File tarFile = new File("F:\\test\\1.zip");
		ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tarFile));
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));
		zipOut.putNextEntry(new ZipEntry(srcFile.getName()));
		byte[] buffer = new byte[1024];
		int b = 0;
		while ((b = in.read(buffer)) != -1) {
			zipOut.write(buffer);
		}
		zipOut.close();
		in.close();
	}
    test文件夹里会生成一个zip文件


    看了代码,就是普通的IO操作类似,不过这里多了一步操作,就是

    zipOut.putNextEntry(new ZipEntry(srcFile.getName()));

    可以理解为在zip文件中生成名字为1.doc的文件,也就是生成zip文件后,打开zip文件后里面有一个1.doc的文件

    如果ZipEntry中的参数为 "目录1/目录1中的文件.doc",那么将生成如下结构


    也就是这个参数的就代表了文件的结构的父子关系,只要如果

    注意:如果该参数最后是以"/"结尾,那么就是一个文件夹,即上面的参数变成"目录1/目录1中的文件.doc/",那么目录1下的就不是一个doc文件了,而是一个名为"目录1中的文件.doc"的文件夹

    所以压缩文件最重要的一点就是设置了这个ZipEntry的参数,他代表了文件的结构,如果错了,那么生成的zip文件中的结构就不对了

    下面是自己写了一个压缩的代码,可以压缩文件和文件夹

	public static void main(String[] args) throws IOException {
		File srcFile = new File("F:\\test\\1.doc");
		File tarFile = new File("F:\\test\\1.zip");
		zip(srcFile, tarFile);
	}
	
	

	/**
	 * @param srcFile
	 *            需要压缩的文件的File对象
	 * @param tarFile
	 *            压缩好的文件的File对象
	 * @throws IOException
	 */
	public static void zip(File srcFile, File tarFile) throws IOException {
		ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tarFile));
		zip(srcFile, tarFile, srcFile.getName(), zipOut);
		zipOut.close();
	}

	/**
	 * @param srcFile
	 *            需要压缩的文件的File对象
	 * @param tarFile
	 *            压缩好的文件的File对象
	 * @param baseFileName
	 *            父级目录名
	 * @param zipOut
	 *            ZipOutputStream对象
	 * @throws IOException
	 */
	public static void zip(File srcFile, File tarFile, String baseFileName, ZipOutputStream zipOut) throws IOException {
		System.out.println(baseFileName);
		if (srcFile.isDirectory()) {// 如果是目录,遍历文件
			File[] files = srcFile.listFiles();
			if (files.length == 0) {//如果没有子目录,那么在zip文件中设置为文件夹
				zipOut.putNextEntry(new ZipEntry(baseFileName + "/"));
			}
			for (int i = 0; i < files.length; i++) {
				zip(files[i], tarFile, baseFileName + "/" + files[i].getName(), zipOut);
			}
		} else {
			BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));
			// 在zip文件中创建目录
			zipOut.putNextEntry(new ZipEntry(baseFileName));
			byte[] buffer = new byte[1024];
			int b = 0;
			while ((b = in.read(buffer)) != -1) {
				zipOut.write(buffer);
			}
			zipOut.flush();
		}
	}

    输入输出没什么好说的,就是简单的IO操作,麻烦的是需要设置好文件目录,这一点是递归实现的

    另外,这篇文章写了有关压缩的知识,可以去看下
http://blog.csdn.net/hanshileiai/article/details/6718375



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值