Java 压缩文件

package com;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class ZipCompressor {
 static final int BUFFER = 8192;

private File zipFile;

public ZipCompressor(String pathName) {
  zipFile = new File(pathName);
 }

public void compress(String srcPathName) {
  File file = new File(srcPathName);
  if (!file.exists())
   throw new RuntimeException(srcPathName + "不存在!");
  try {
   FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
   CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());
   ZipOutputStream out = new ZipOutputStream(cos);
   String basedir = "";
   compress(file, out, basedir);
   out.close();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }

private void compress(File file, ZipOutputStream out, String basedir) {
  /* 判断是目录还是文件 */
  if (file.isDirectory()) {
   System.out.println("压缩:" + basedir + file.getName());
   this.compressDirectory(file, out, basedir);
  } else {
   System.out.println("压缩:" + basedir + file.getName());
   this.compressFile(file, out, basedir);
  }
 }

/** 压缩一个目录 */
 private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
  if (!dir.exists())
   return;

File[] files = dir.listFiles();
  for (int i = 0; i < files.length; i++) {
   /* 递归 */
   compress(files[i], out, basedir + dir.getName() + "/");
  }
 }

/** 压缩一个文件 */
 private void compressFile(File file, ZipOutputStream out, String basedir) {
  if (!file.exists()) {
   return;
  }
  try {
   BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
   ZipEntry entry = new ZipEntry(basedir + file.getName());
   out.putNextEntry(entry);
   int count;
   byte data[] = new byte[BUFFER];
   while ((count = bis.read(data, 0, BUFFER)) != -1) {
    out.write(data, 0, count);
   }
   bis.close();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}

//-------------------------------------------------------------------------------------------------------------

下面是测试

package com;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

public class Test {

public static void main(String[] args) {
  // 1-----------------------------------------------------建立压缩文件
  // 将f:/code 目录压缩到f:/test.zip 文件中
  ZipCompressor zc = new ZipCompressor("f:/中国人.zip");
  zc.compress("f:/code");

// 2-----------------------------------------------------解压缩文件
  FileOutputStream fileOut;
  File file;
  InputStream inputStream;
  try {
   // 要解压的文件 f:/中国人.zip
   ZipFile zipFile = new ZipFile("f:/中国人.zip");

// 解压到指定目录下f:/ 自建立相关的code目录
   String path = "f:/";
   for (Enumeration entries = zipFile.getEntries(); entries.hasMoreElements();) {
    ZipEntry entry = (ZipEntry) entries.nextElement();
    file = new File(path + entry.getName());
    if (entry.isDirectory()) {
     file.mkdirs();
    } else {
     // 如果指定文件的目录不存在,则创建之.
     File parent = file.getParentFile();
     if (!parent.exists()) {
      parent.mkdirs();
     }

inputStream = zipFile.getInputStream(entry);
     int readedBytes = 0;
     byte[] buf = new byte[1024];
     fileOut = new FileOutputStream(file);
     while ((readedBytes = inputStream.read(buf)) > 0) {
      fileOut.write(buf, 0, readedBytes);
     }
     fileOut.close();

inputStream.close();
    }
   }
   zipFile.close();
  } catch (IOException ioe) {
   ioe.printStackTrace();
  }
 }
}

时间: 2024-10-11 16:34:28

Java 压缩文件的相关文章

Java压缩文件

import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.to

简单测试Demo:如何用Java压缩文件夹和文件

一.直接贴出测试代码 1 package com.jason.zip; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.util.ArrayList; 9 import java.util.List; 10 i

java压缩文件解压:调用WinRAR5命令强于自己写代码实现

最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.jar 2.解压zip格式,采用的是commons-compress-1.4.1.jar 但最近根据用户反馈的问题,发现系统存在两个关于压缩文件解压的问题: 1.有些压缩文件解压之后出现中文乱码: 2.有些压缩文件根本不能解压 为了弥补上述两个问题,在之前代码的基础上打了一些补丁,来解决zip压缩包乱

Java 压缩文件夹工具类(包含解压)

依赖jar <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.18</version> </dependency> CompressUtils.java package utils; import java.io.BufferedInputStream;

java压缩文件中文名乱码问题

import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; 改为 import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; ant包里提供ZipOutputStream类的setEncoding("gbk")方法. zos.setEncoding("gbk"); ant包下载(点击进

Java压缩文件以及解压文件

压缩流类: GZIPOutputStream和ZIpOutputStream可分别把数据压缩成GZip格式和Zip格式 GZIPInputStream和ZipInputStream可分别把压缩成GZIP格式或Zip的数据解压恢复原状 GZIP是多个文件压缩成一个文件,Zip是单个文件压缩: d多个文件依次压缩,out.putNextEntry是将文件的入口信息压缩到压缩文件中,getNextEntry判断是否有下一个文件 原文地址:https://www.cnblogs.com/mcmx/p/9

java压缩文件出现中文乱码问题

在项目中需要压缩文件下载,做完了发现有中文乱码问题,终于明白了. 引入ant.jar包 import org.apache.tools.zip.ZipEntry;   import org.apache.tools.zip.ZipOutputStream;

Java使用Zip压缩文件或整个目录

1.压缩文件或整个目录 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.zip.ZipEntry

Java学习笔记之I/O流(读取压缩文件以及压缩文件)

1.读取压缩文件:ZipInputStream 借助ZipFile类的getInputStream方法得到压缩文件的指定项的内容,然后传递给InputStreamReader类的构造方法,返回给BufferedReader类实例化,从而使得指定项的内容输出到内存中. 2.压缩文件:ZipOutputStream 2.1 注意,zipOut.putNextEntry(entry);// 此方法会清空zip文件原来存在的内容,然后写入文件,并将流定位到条目数据的开始处,直到关闭ZipOutputSt