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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王震阳老师   /  2014-8-18 10:51  /  24588 人查看  /  273 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

前一个没有保存就发出去,可能有点遗漏。。。这个是最终版。。
恳请老师可以指点不足之处。。

decompression.zip

1.16 KB, 阅读权限: 200, 下载次数: 1

评分

参与人数 1技术分 +3 收起 理由
王震阳老师 + 3 赞一个!

查看全部评分

回复 使用道具 举报
请查收!

DecompressDemo.zip

1.64 KB, 阅读权限: 200, 下载次数: 2

评分

参与人数 1技术分 +3 收起 理由
王震阳老师 + 3 赞一个!

查看全部评分

回复 使用道具 举报
看看什么题
回复 使用道具 举报
来领题咯
回复 使用道具 举报
我不是来领题的...;P
回复 使用道具 举报
领题目了
回复 使用道具 举报
查看题目....
回复 使用道具 举报
前来领题:)
回复 使用道具 举报
先看看,貌似还做不出来
回复 使用道具 举报
shen7518 来自手机 中级黑马 2014-8-21 12:32:33
170#
看看题目再说
回复 使用道具 举报
zip解压,阳哥过目。

Zip.zip

868 Bytes, 阅读权限: 200, 下载次数: 1

评分

参与人数 1技术分 +2 收起 理由
王震阳老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
技术分什么时候给?为什么我没有得到呢?
回复 使用道具 举报
yqj 发表于 2014-8-19 19:02
终于做完了,支持压缩和解压功能

挺好:
  1. package cn.test;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.Enumeration;
  8. import java.util.Scanner;
  9. import java.util.zip.ZipEntry;
  10. import java.util.zip.ZipFile;
  11. import java.util.zip.ZipInputStream;
  12. import java.util.zip.ZipOutputStream;

  13. public class ZipTool {
  14.         public static void main(String[] args) {
  15.                 ZipTool test = new ZipTool();
  16.                 Scanner sc = new Scanner(System.in);
  17.                 while (true) {
  18.                         System.out.println("请您选择操作:(A)压缩文件 \t(B)解压文件");
  19.                         System.out.println("\t\t\t说明:输入A或B");
  20.                         String operate = sc.nextLine();
  21.                         if ("A".equalsIgnoreCase(operate)) {
  22.                                 System.out.println("注意:压缩后的zip文件不能存放在要压缩的文件夹中!");
  23.                                 System.out.println("请输入要解压的文件位置(文件或文件夹):");
  24.                                 String srcPath=sc.nextLine();
  25.                                 System.out.println("请输入要解压到的位置(只能是文件夹):");
  26.                                 String targetDirPath=sc.nextLine();
  27.                                 System.out.println("请输入解压后的文件名(不含\".zip\"后缀):");
  28.                                 String zipName=sc.nextLine();
  29.                                 try {
  30.                                         test.zip(srcPath, targetDirPath, zipName);       
  31.                                         System.out.println("操作成功!");
  32.                                 } catch (Exception e) {
  33.                                         System.out.println(e.getMessage());
  34.                                 }
  35.                         } else if ("B".equalsIgnoreCase(operate)) {
  36.                                 System.out.println("请输入要解压的zip文件地址:");
  37.                                 String zipF=sc.nextLine();
  38.                                 System.out.println("请输入解压后的文件存放的位置:");                               
  39.                                 String targetPath =sc.nextLine();
  40.                                 try {
  41.                                         test.unzip(zipF, targetPath);
  42.                                         System.out.println("操作成功!");
  43.                                 } catch (Exception e) {
  44.                                         System.out.println(e.getMessage());
  45.                                 }
  46.                         } else {
  47.                                 System.out.println("输入错误!");
  48.                                 continue;
  49.                         }
  50.                         System.out.println("是否继续?输入Y继续,其他任意键回车后退出");
  51.                         if("Y".equalsIgnoreCase(sc.nextLine())){
  52.                                 continue;
  53.                         }else{
  54.                                 break;
  55.                         }
  56.                 }
  57.                 sc.close();
  58.         }

  59.         /**
  60.          * 解压方式一,通过ZipFile的方式获取所有的ZipEntry条目,并通过zipFile.getInputStream(entry)方法获取流
  61.          *
  62.          * @param zipF
  63.          *            源位置
  64.          * @param target
  65.          *            目标位置
  66.          * @throws IOException
  67.          * @throws Exception
  68.          */
  69.         private void unzip(String zipF, String targetPath) throws IOException {
  70.                 File target = new File(targetPath);
  71.                 // 获取zipFile
  72.                 ZipFile zipFile = null;
  73.                 try {
  74.                         zipFile = new ZipFile(zipF);
  75.                 } catch (Exception e) {
  76.                         throw new RuntimeException("读取Zip文件错误!");
  77.                 }
  78.                
  79.                 // 通过zipfile获取所有的ZipEntry
  80.                 Enumeration<? extends ZipEntry> entries = zipFile.entries();
  81.                 // 创建目标文件夹
  82.                 if (!target.exists() || target.isFile())
  83.                         target.mkdirs();
  84.                 // 解压操作
  85.                 while (entries.hasMoreElements()) {
  86.                         ZipEntry entry = entries.nextElement();
  87.                         String entryName = entry.getName();
  88.                         // 当entry是文件夹时在target中创建对应的文件夹,是文件时创建对应的文件
  89.                         if (entry.isDirectory()) {
  90.                                 File dir = new File(target, entryName);
  91.                                 if (!dir.exists() || dir.isFile())
  92.                                         dir.mkdirs();
  93.                         } else {
  94.                                 File path = new File(target, entryName);
  95.                                 File parent = path.getParentFile();
  96.                                 if (!parent.exists() || parent.isFile())
  97.                                         parent.mkdirs();

  98.                                 // 流读写操作

  99.                                 FileOutputStream fos = new FileOutputStream(path);
  100.                                 InputStream in = zipFile.getInputStream(entry);
  101.                                 byte[] b = new byte[1024];
  102.                                 int len = 0;
  103.                                 while ((len = in.read(b)) != -1) {
  104.                                         fos.write(b, 0, len);
  105.                                 }
  106.                                 fos.close();
  107.                                 in.close();
  108.                         }
  109.                 }
  110.         }

  111.         /**
  112.          * 解压方式二:通过ZipInputStream的getNextEntry()的方法获取所有条目
  113.          *
  114.          * @param zipF
  115.          * @param target
  116.          * @throws Exception
  117.          */
  118.         private void unzip2(String zipF, String targetPath) throws Exception {
  119.                 File target = new File(targetPath);
  120.                 ZipInputStream zipIn = null;
  121.                 try {
  122.                         zipIn = new ZipInputStream(new FileInputStream(zipF));
  123.                 } catch (Exception e) {
  124.                         throw new RuntimeException("读取Zip文件错误!");
  125.                 }
  126.                 // 定义ZipEntry
  127.                 ZipEntry entry = null;
  128.                 // 创建目标文件夹
  129.                 if (!target.exists() || target.isFile())
  130.                         target.mkdirs();
  131.                 while ((entry = zipIn.getNextEntry()) != null) {
  132.                         String entryName = entry.getName();
  133.                         if (entry.isDirectory()) {
  134.                                 File dir = new File(target, entryName);
  135.                                 if (!dir.exists() || dir.isFile())
  136.                                         dir.mkdirs();
  137.                         } else {
  138.                                 File dir = new File(target, entryName);
  139.                                 File parent = dir.getParentFile();
  140.                                 if (!parent.exists() || parent.isFile())
  141.                                         parent.mkdirs();
  142.                                 // 流读写操作
  143.                                 FileOutputStream fos = new FileOutputStream(dir);

  144.                                 byte[] b = new byte[1024];
  145.                                 int len = 0;
  146.                                 while ((len = zipIn.read(b)) != -1) {
  147.                                         fos.write(b, 0, len);
  148.                                 }
  149.                                 fos.close();
  150.                         }
  151.                         zipIn.closeEntry();// 关闭当前条目
  152.                 }
  153.                 zipIn.close();
  154.         }

  155.         /**
  156.          *
  157.          * @param srcPath
  158.          *            源
  159.          * @param targetDirPath
  160.          *            压缩到的位置
  161.          * @param zipName
  162.          *            压缩后的文件名
  163.          * @throws IOException
  164.          */
  165.         public void zip(String srcPath, String targetDirPath, String zipName)
  166.                         throws IOException {
  167.                 if(targetDirPath.startsWith(srcPath)){
  168.                         throw new RuntimeException("压缩后的zip文件不能存放在要压缩的文件夹中!");
  169.                 }
  170.                 File srcF = new File(srcPath);
  171.                 // 对源文件进行检查
  172.                 if (!srcF.exists()) {
  173.                         throw new RuntimeException("您输入的文件位置不存在!");
  174.                 }
  175.                 // 当目标目录不存在时创建
  176.                 File targetDir = new File(targetDirPath);
  177.                 if (!targetDir.exists()||targetDir.isFile()) {
  178.                         targetDir.mkdirs();
  179.                 }
  180.                 File targetF = new File(targetDir, zipName + ".zip");
  181.                 // 防止原已经存在的文件被覆盖,如a.zip存在时文件名为a(1).zip..
  182.                 int count = 0;
  183.                 while (targetF.exists() && !targetF.isDirectory()) {
  184.                         targetF = new File(targetDir, zipName + "(" + (++count) + ").zip");
  185.                 }
  186.                 // 压缩操作
  187.                 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(
  188.                                 targetF));
  189.                 zip(srcF, zipOut, "");
  190.                 zipOut.close();// 关闭zip流
  191.                 if (count != 0) {
  192.                         System.out.println("由于文件夹中已经存在" + zipName + ".zip文件,系统自动分配文件文件名为:"
  193.                                         + zipName + "(" + (count) + ").zip");
  194.                 }
  195.         }

  196.         /**
  197.          * 压缩主方法
  198.          *
  199.          * @param srcF
  200.          *            要压缩的源文件
  201.          * @param zipOut
  202.          * @param parentPath
  203.          *            上级目录
  204.          * @throws IOException
  205.          */
  206.         private void zip(File srcF, ZipOutputStream zipOut, String parentPath)
  207.                         throws IOException {
  208.                 if (srcF.isDirectory()) {
  209.                         // 下一条目的上一级
  210.                         parentPath = parentPath + srcF.getName() + "/";
  211.                         // 添加一条ZipEntry
  212.                         zipOut.putNextEntry(new ZipEntry(parentPath));
  213.                         zipOut.closeEntry();// 关闭ZipEntry
  214.                         zipOut.flush(); // 刷新
  215.                         // 用递归的方法继续寻找下级的文件
  216.                         File[] files = srcF.listFiles();
  217.                         for (File file : files) {
  218.                                 zip(file, zipOut, parentPath);
  219.                         }
  220.                 } else {
  221.                         zipOut.putNextEntry(new ZipEntry(parentPath + srcF.getName()));
  222.                         // 将文件写入到Zip输出流
  223.                         FileInputStream fis = null;
  224.                         try {
  225.                                 fis = new FileInputStream(srcF);
  226.                                 byte[] b = new byte[1024];
  227.                                 int len = 0;
  228.                                 while ((len = fis.read(b)) != -1) {
  229.                                         zipOut.write(b, 0, len);
  230.                                 }
  231.                         } catch (Exception e) {
  232.                                 throw new RuntimeException("压缩文件失败!");
  233.                         } finally {
  234.                                 if (fis != null)
  235.                                         fis.close();
  236.                         }
  237.                         zipOut.closeEntry();
  238.                         zipOut.flush();
  239.                 }
  240.         }
  241. }
复制代码
回复 使用道具 举报 2 0
yqj 中级黑马 2014-8-21 14:49:21
174#

感谢阳哥,终于上榜一次,刚刚又瞄了眼题目,我似乎把题意搞错。。。
回复 使用道具 举报
我来看看。
回复 使用道具 举报
老师 ,领题!
回复 使用道具 举报

你好 ,能看看你怎么写的吗?我写不出来,请你帮帮忙!
回复 使用道具 举报

你好,能帮帮忙吗?我写不出来看看你怎么写的 哥们。求帮助!
回复 使用道具 举报
---------华丽的分割线------------

12解压.zip

1.51 KB, 阅读权限: 200, 下载次数: 1

答案

评分

参与人数 1技术分 +2 收起 理由
王震阳老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
@for 中级黑马 2014-8-21 16:44:41
180#
回帖看题目
。。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马