iteye_515 2010-05-06 16:42
浏览 284
已采纳

java 读写加密的zip文件,哪里有资料或者代码?

找了很久没有头绪

  • 写回答

1条回答 默认 最新

  • jiangguangxian 2010-05-07 08:18
    关注

    在Java中操作Zip文件,压缩/解压
    [code="java"]

      package test.nothing;
      import java.io.*;
      import java.util.*;
      import java.util.zip.*;
      import com.beaconsystem.util.*;
      import junit.framework.TestCase;
      /**
      * @author SonyMusic
      *
      * 用于测试java.util.zip包压缩和解压缩文件zip文件的例子.
      * 基于JUnit编写,包括两个test方法,和三个辅助方法.
      * 注意到使用过程中操作的全是流,所以不仅仅可以读写文件。这只是一个简单的例子.
      */
      public class TestZipOp extends TestCase {
      /**
      * Constructor for TestZipOp.
      * @param arg0
      */
      public TestZipOp(String arg0) {
      super(arg0);
      }
      public static void main(String[] args) {
      junit.textui.TestRunner.run(TestZipOp.class);
      }
      /**
      * zip压缩功能测试.
      * 将d:\temp\zipout目录下的所有文件连同子目录压缩到d:\temp\out.zip.
      * @throws Exception
      */
      public void testCreateZip() throws Exception{
      //压缩baseDir下所有文件,包括子目录
      String baseDir="d:\temp\zipout";
      List fileList=getSubFiles(new File(baseDir));
      //压缩文件名
      ZipOutputStream zos=new ZipOutputStream(new FileOutputStream("d:\temp\out.zip"));
      ZipEntry ze=null;
      byte[] buf=new byte[1024];
      int readLen=0;
      for (int i = 0; i   File f=(File)fileList.get(i);
      System.out.print("Adding: "+f.getPath()+f.getName());
      //创建一个ZipEntry,并设置Name和其它的一些属性
      ze=new ZipEntry(getAbsFileName(baseDir, f));
      ze.setSize(f.length());
      ze.setTime(f.lastModified());
      //将ZipEntry加到zos中,再写入实际的文件内容
      zos.putNextEntry(ze);
      InputStream is=new BufferedInputStream(new FileInputStream(f));
      while ((readLen=is.read(buf, 0, 1024))!=-1) {
      zos.write(buf, 0, readLen);
      }
      is.close();
      System.out.println(" done...");
      }
      zos.close();
      }
      /**
      * 测试解压缩功能.
      * 将d:\\download\\test.zip文件解压到d:\\temp\\zipout目录下.
      * @throws Exception
      */
      public void testReadZip() throws Exception{
      //InputStream is=new BufferedInputStream(new FileInputStream());
      String baseDir="d:\\temp\\zipout";
      ZipFile zfile=new ZipFile("d:\\download\\Test.zip");
      System.out.println(zfile.getName());
      Enumeration zList=zfile.entries();
      ZipEntry ze=null;
      byte[] buf=new byte[1024];
      while(zList.hasMoreElements()){
      //从ZipFile中得到一个ZipEntry
      ze=(ZipEntry)zList.nextElement();
      if(ze.isDirectory()){
      System.out.println("Dir: "+ze.getName()+" skipped..");
      continue;
      }
      System.out.println("Extracting: "+ze.getName()+"\t"+ze.getSize()+"\t"+ze.getCompressedSize());
      //以ZipEntry为参数得到一个InputStream,并写到OutputStream中
      OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(baseDir, ze.getName())));
      InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
      int readLen=0;
      while ((readLen=is.read(buf, 0, 1024))!=-1) {
      os.write(buf, 0, readLen);
      }
      is.close();
      os.close();
      System.out.println("Extracted: "+ze.getName());
      }
      zfile.close();
      }
      /**
      * 给定根目录,返回一个相对路径所对应的实际文件名.
      * @param baseDir 指定根目录
      * @param absFileName 相对路径名,来自于ZipEntry中的name
      * @return java.io.File 实际的文件
      */
      private File getRealFileName(String baseDir, String absFileName){
      String[] dirs=Regex.split("/", absFileName);
      //System.out.println(dirs.length);
      File ret=new File(baseDir);
      if(dirs.length>1){
      for (int i = 0; i <dirs.length-1; i++) {
      ret=new File(ret, dirs[i]);
      }
      }
      if(!ret.exists()){
      ret.mkdirs();
      }
      ret=new File(ret, dirs[dirs.length-1]);
      return ret;
      }
      /**
      * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
      * @param baseDir java.lang.String 根目录
      * @param realFileName java.io.File 实际的文件名
      * @return 相对文件名
      */
      private String getAbsFileName(String baseDir, File realFileName){
      File real=realFileName;
      File base=new File(baseDir);
      String ret=real.getName();
      while (true) {
      real=real.getParentFile();
      if(real==null) break;
      if(real.equals(base)) break;
      else{
      ret=real.getName()+"/"+ret;
      }
      }
      return ret;
      }
      /**
      * 取得指定目录下的所有文件列表,包括子目录.
      * @param baseDir File 指定的目录
      * @return 包含java.io.File的List
      */
      private List getSubFiles(File baseDir){
      List ret=new ArrayList();
      //File base=new File(baseDir);
      File[] tmp=baseDir.listFiles();
      for (int i = 0; i <tmp.length; i++) {
      if(tmp[i].isFile()){
      ret.add(tmp[i]);
      }
      if(tmp[i].isDirectory()){
      ret.addAll(getSubFiles(tmp[i]));
      }
      }
      return ret;
      }
      }(

    [/code]

    试试行不,java中有专门的包老进行zip操作,
    Java.util.zip压缩包
    Java.util.zip压缩包对读写ZIP和GZIP格式文件提供了分类,从这些格式中读取文件就需要创建合适的 InflaterInputStream,先以GZIP格式为例。

    GZIPInputStream可以以InputStream (象FileInputStream)为例,在我的例子中,我想要读取一个文件中的一行这样我就要用StringTokenizer解析每一个entry,为了达到这一目的,我采用在代码下创建BufferedReader的方法。(见表A中的所有源代码)
    [code="java"]
    gzipReader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(fileName))));[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路