A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 奋斗2013 中级黑马   /  2013-4-5 10:46  /  3598 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 奋斗2013 于 2013-4-6 15:49 编辑

ZipEntry类创建的对象代表什么?zip压缩文件内容是什么?也就是他的文件结构?

3 个回复

倒序浏览
关于ZipEntry类:
-在每一个压缩文件中都会勋在多个子文件,那么这每一个的子文件在JAVA中用ZipEntry表示
-ZipEntry类的常用方法:
  · public ZipEntry(String name) : 创建对象并指出要创建的ZipEntry名称
  · public boolean isDirectory() : 判断此ZipEntry是否是目录
在实例化ZipEntry的时候,要设置名称,此名称实际上就是压缩文件中每一个元素的名称



在java中,每一个压缩文件都可以使用ZipFile表示,还可以使用ZipFile根据压缩后的文件名称
    找到每一个压缩文件中的ZipEntry并将其进行解压缩操作。
-public ZipFile(File file) :  根据File类实例化ZipFile对象
  (此File类的实例是指向一个压缩的*.zip文件)
-public ZipEntry getEntry(String name) : 根据名称找到其对应的ZipEntry
-public InputStream getInputStream(ZipEntry entry) : 根据ZipEntry取得InputStream 实例
-public String getName() : 得到压缩文件的路径名称
关于文件解压缩的一个小示例代码:
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.io.FileOutputStream;
public class ZipFileDemo02{
public static void main(String[] args) throws Exception{
  File file=new File("压缩文件完成路径名称");
  File outputFile=new File("解压缩的文件名称");
  ZipFile zipFile=new ZipFile(file);
  ZipEntry entry = zipFile.getEntry("一个压缩实体的名称");
  OutputStream out=new FileOutputStream(outputFile);
  InputStream input=zipFile.getInputStream(entry);
  int temp=0;
  while((temp=input.read())!=-1){
   out.write(temp);
  }
  input.close();
  out.close();
}
}
ZipFile对象,可以找到每一个ZipEntry的输入流,但是ZipInputStream并不能得到每一个输入
    流,所以需要使用ZipFile,但是ZipInputStream在取得每一个ZipEntry的时候,不需要每一个ZipEntry
    的名称

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
楼上是大神!好像是创建一个文件条目
回复 使用道具 举报
public class ZipEntry extends Objectimplements Cloneable
  1. package com.sunny.zip;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.util.ArrayList;
  11. import java.util.Enumeration;
  12. import java.util.List;
  13. import java.util.zip.ZipEntry;
  14. import java.util.zip.ZipFile;
  15. import java.util.zip.ZipOutputStream;

  16. /**
  17. * 此类用于测试JAVA的ZIP压缩及解压
  18. *
  19. * @author Sunny Lee (2008-1-4)
  20. * @version 1.0
  21. */
  22. public class ZipManager {

  23. /**
  24. * zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
  25. * 此方法可保留被压缩文件的目录结构
  26. *
  27. * @param baseDir
  28. *            所要压缩的目录名(包含绝对路径)
  29. * @param objFileName
  30. *            压缩后的文件名
  31. * @throws Exception
  32. */
  33. public void createZip(String baseDir, String objFileName) throws Exception {
  34.    File folderObject = new File(baseDir);

  35.    if (folderObject.exists()) {
  36.     List fileList = getSubFiles(new File(baseDir));


  37.     // 压缩文件名
  38.     ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
  39.       objFileName));

  40.     ZipEntry ze = null;
  41.     byte[] buf = new byte[1024];
  42.     int readLen = 0;
  43.     for (int i = 0; i < fileList.size(); i++) {
  44.      File f = (File) fileList.get(i);
  45.      System.out.println("Adding: " + f.getPath() + f.getName());

  46.      /*
  47.      * 创建一个ZipEntry,并设置Name和其它的一些属性
  48.      * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的
  49.      */
  50.      ze = new ZipEntry(getAbsFileName(baseDir, f));
  51.      ze.setSize(f.length());
  52.      ze.setTime(f.lastModified());

  53.      // 将ZipEntry加到zos中,再写入实际的文件内容
  54.      zos.putNextEntry(ze);
  55.      InputStream is = new BufferedInputStream(new FileInputStream(f));
  56.      while ((readLen = is.read(buf, 0, 1024)) != -1) {
  57.       zos.write(buf, 0, readLen);
  58.      }
  59.      is.close();
  60.      System.out.println("done...");
  61.     }
  62.     zos.close();
  63.    } else {
  64.     throw new Exception("this folder isnot exist!");
  65.    }
  66. }

  67. /**
  68. * 对某一个文件进行压缩,不允许是目录或包含子目录
  69. *
  70. * @param sourceFileName
  71. *            被压缩的目标文件,不允许是目录或包含子目录
  72. * @param zipFilename
  73. *            为压缩后的文件指定的名称
  74. * @return 压缩文件的大小
  75. * @throws Exception
  76. */
  77. public long createFileToZip(String sourceFileName, String zipFilename)
  78.     throws Exception {

  79.    File sourceFile = new File(sourceFileName);

  80.    byte[] buf = new byte[1024];

  81.    // 压缩文件名
  82.    File objFile = new File(zipFilename);

  83.    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));

  84.    ZipEntry ze = null;
  85.    // 创建一个ZipEntry,并设置Name和其它的一些属性
  86.    ze = new ZipEntry(sourceFile.getName());
  87.    ze.setSize(sourceFile.length());
  88.    ze.setTime(sourceFile.lastModified());

  89.    // 将ZipEntry加到zos中,再写入实际的文件内容
  90.    zos.putNextEntry(ze);

  91.    InputStream is = new BufferedInputStream(
  92.      new FileInputStream(sourceFile));

  93.    int readLen = -1;
  94.    while ((readLen = is.read(buf, 0, 1024)) != -1) {
  95.     zos.write(buf, 0, readLen);
  96.    }
  97.    is.close();
  98.    zos.close();

  99.    return objFile.length();
  100. }

  101. /**
  102. * 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.
  103. *
  104. * @param sourceZip
  105. *            待解压的zip文件
  106. * @param outFileName
  107. * @throws IOException
  108. */
  109. public void releaseZipToFile(String sourceZip, String outFileName)
  110.     throws IOException {
  111.    ZipFile zfile = new ZipFile(sourceZip);
  112.    System.out.println("待解压的文件是: " + zfile.getName());
  113.    Enumeration zList = zfile.entries();
  114.    ZipEntry ze = null;
  115.    byte[] buf = new byte[1024];
  116.    while (zList.hasMoreElements()) {
  117.     // 从ZipFile中得到一个ZipEntry
  118.     ze = (ZipEntry) zList.nextElement();
  119.     if (ze.isDirectory()) {
  120.      continue;
  121.     }
  122.     // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
  123.     InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
  124.     OutputStream os = new BufferedOutputStream(new FileOutputStream(
  125.       getRealFileName(outFileName, ze.getName())));
  126.     int readLen = 0;
  127.     while ((readLen = is.read(buf, 0, 1024)) != -1) {
  128.      os.write(buf, 0, readLen);
  129.     }
  130.     is.close();
  131.     os.close();
  132.     System.out.println("Extracted: " + ze.getName());
  133.    }
  134.    zfile.close();

  135. }

  136. /**
  137. * 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.
  138. *
  139. * @param baseDir
  140. *            File 指定的目录
  141. * @return 包含java.io.File的List
  142. */
  143. private List getSubFiles(File baseDir) {
  144.    List fileList = new ArrayList();
  145.    File[] tmp = baseDir.listFiles();
  146.    for (int i = 0; i < tmp.length; i++) {
  147.     // 如果是文件,直接加入fileList
  148.     if (tmp[i].isFile()) {
  149.      fileList.add(tmp[i]);
  150.     }
  151.     // 如果是目录,递归调用本方法,并将结果集加入fileList
  152.     if (tmp[i].isDirectory()) {
  153.      fileList.addAll(getSubFiles(tmp[i]));
  154.     }
  155.    }
  156.    return fileList;
  157. }

  158. /**
  159. * 给定根目录,返回一个相对路径所对应的实际文件名.
  160. *
  161. * @param baseDir
  162. *            指定根目录
  163. * @param absFileName
  164. *            相对路径名,来自于ZipEntry中的name
  165. * @return java.io.File 实际的文件
  166. */
  167. private File getRealFileName(String baseDir, String absFileName) {
  168.    String[] dirs = absFileName.split("/");
  169.    File ret = new File(baseDir);
  170.    // 创建目录结构
  171.    if (dirs.length > 1) {
  172.     for (int i = 0; i < dirs.length - 1; i++) {
  173.      ret = new File(ret, dirs[i]);
  174.     }
  175.    }
  176.    if (!ret.exists()) {
  177.     ret.mkdirs();
  178.    }
  179.    ret = new File(ret, dirs[dirs.length - 1]);
  180.    return ret;
  181. }

  182. /**
  183. * 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径.
  184. * 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt
  185. *
  186. * @param baseDir
  187. *            java.lang.String 根目录
  188. * @param realFileName
  189. *            java.io.File 实际的文件名
  190. * @return 相对文件名
  191. */
  192. private String getAbsFileName(String baseDir, File realFileName) {
  193.    File real = realFileName;
  194.    File base = new File(baseDir);
  195.    String ret = real.getName();

  196.    while (true) {
  197.     real = real.getParentFile();
  198.     if (real == null)
  199.      break;
  200.     if (real.equals(base))
  201.      break;
  202.     else {
  203.      ret = real.getName() + "/" + ret;
  204.     }
  205.    }
  206.    return ret;
  207. }

  208. public static void main(String args[]) {
  209.    ZipManager manager = new ZipManager();
  210.    try {
  211.     manager.releaseZipToFile("d:\\download\\src.zip",
  212.       "d:\\temp\\zipout");
  213. //    manager.createZip("d:\\temp\\zipout", "d:\\temp\\out.zip");
  214.    } catch (Exception e) {
  215.     e.printStackTrace();
  216.    }
  217.    System.out.println("over");
  218. }
  219. }
复制代码
public class ZipEntry  extends Objectimplements Cloneable
此类用于表示 ZIP 文件条目。
以上代码是一位大神写的一个关于测试JAVA的ZIP压缩及解压
的代码  希望对你有所帮助

评分

参与人数 2技术分 +2 收起 理由
陈丽莉 + 1 赞一个! 再加一分~
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马