项目常用的压缩流---java.util.zip.ZipInputStream类和java.util.zip.ZipOutputStream类

java.util.zip.ZipInputStream类

java.util.zip.ZipInputStream类实现用于读取ZIP文件格式文件的输入流过滤器。 包括对压缩和未压缩条目的支持。

(该类实现一个输入流过滤器,用于读取ZIP文件格式的文件。包括对压缩和未压缩条目的支持。这里的条目应该是指能读入和输出数据的文件,区别文件和文件夹)

类声明

以下是java.util.zip.ZipInputStream类的声明 -

public class ZipInputStream  extends InflaterInputStream

Java

字段

以下是java.util.zip.ZipInputStream类的字段 -

  • static int CENATT
  • static int CENATX
  • static int CENCOM
  • static int CENCRC
  • static int CENDSK
  • static int CENEXT
  • static int CENFLG
  • static int CENHDR
  • static int CENHOW
  • static int CENLEN
  • static int CENNAM
  • static int CENOFF
  • static long CENSIG
  • static int CENSIZ
  • static int CENTIM
  • static int CENVEM
  • static int CENVER
  • static int ENDCOM
  • static int ENDHDR
  • static int ENDOFF
  • static long ENDSIG
  • static int ENDSIZ
  • static int ENDSUB
  • static int ENDTOT
  • static int EXTCRC
  • static int EXTHDR
  • static int EXTLEN
  • static long EXTSIG
  • static int EXTSIZ
  • static int LOCCRC
  • static int LOCEXT
  • static int LOCFLG
  • static int LOCHDR
  • static int LOCHOW
  • static int LOCLEN
  • static int LOCNAM
  • static long LOCSIG
  • static int LOCSIZ
  • static int LOCTIM
  • static int LOCVER

构造函数

编号 构造函数 描述
1 ZipInputStream(InputStream in) 创建一个新的ZIP输入流。
2 ZipInputStream(InputStream in, Charset charset) 创建一个新的ZIP输入流。

类方法

编号 方法 描述
1 int available() 达到当前输入数据结尾(EOF)之后返回0,否则返回1
2 void close() 关闭此输入流并释放与该流关联的所有系统资源。
3 void closeEntry() 关闭当前的ZIP条目并定位流以读取下一个条目。
4 ZipEntry getNextEntry() 读取下一个ZIP文件条目并将该流定位在条目数据的开头。
5 int read(byte[] b, int off, int len) 从当前的ZIP条目读入一个字节数组。
6 long skip(long n) 跳过当前ZIP条目中指定的字节数(在文件内跳过指定的n个字节)。

继承的方法

这个类继承了以下类的方法 -

  • java.util.zip.InflaterInputStream
  • java.io.FilterInputStream
  • java.lang.Object

java.util.zip.ZipOutputStream类

java.util.zip.ZipOutputStream类实现一个输出流过滤器,用于以ZIP文件格式写入文件。 包括对压缩和未压缩条目的支持。

类声明

以下是java.util.zip.ZipOutputStream类的声明 -

public class ZipOutputStream extends DeflaterOutputStream

Java

字段

以下是java.util.zip.ZipOutputStream类的字段 -

  • static int CENATT
  • static int CENATX
  • static int CENCOM
  • static int CENCRC
  • static int CENDSK
  • static int CENEXT
  • static int CENFLG
  • static int CENHDR
  • static int CENHOW
  • static int CENLEN
  • static int CENNAM
  • static int CENOFF
  • static long CENSIG
  • static int CENSIZ
  • static int CENTIM
  • static int CENVEM
  • static int CENVER
  • static int DEFLATED - 压缩(DEFLATED)条目的压缩方法。
  • static int ENDCOM
  • static int ENDHDR
  • static int ENDOFF
  • static long ENDSIG
  • static int ENDSIZ
  • static int ENDSUB
  • static int ENDTOT
  • static int EXTCRC
  • static int EXTHDR
  • static int EXTLEN
  • static long EXTSIG
  • static int EXTSIZ
  • static int LOCCRC
  • static int LOCEXT
  • static int LOCFLG
  • static int LOCHDR
  • static int LOCHOW
  • static int LOCLEN
  • static int LOCNAM
  • static long LOCSIG
  • static int LOCSIZ
  • static int LOCTIM
  • static int LOCVER
  • static int STORED - 未压缩(STORED)条目的压缩方法。

构造函数

编号 构造函数 描述
1 ZipOutputStream(OutputStream out) 创建一个新的ZIP输出流。
2 ZipOutputStream(OutputStream out, Charset charset) 使用指定字符我们要创建一个新的ZIP输出流。

类方法

编号 方法 描述
1 void close() 关闭ZIP输出流以及正在过滤的流。
2 void closeEntry() 关闭当前的ZIP条目并定位写入下一个条目的流。
3 void finish() 完成编写ZIP输出流的内容而不关闭底层流。
4 void putNextEntry(ZipEntry e) 开始编写新的ZIP文件条目并将流定位到条目数据的开头。
5 void setComment(String comment) 设置ZIP文件的注释
6 void setLevel(int level) 为后续的DEFLATED条目设置压缩级别。
7 void setMethod(int method) 为后续条目设置默认压缩方法。
8 void write(byte[] b, int off, int len) 将一个字节数组写入当前ZIP条目数据。

继承的方法

这个类继承了以下类的方法 -

  • java.util.zip.DeflaterOutputStream
  • java.io.FilterOutputStream
  • java.lang.Object

原文链接:https://www.yiibai.com/javazip/javazip_zipoutputstream.html

以下是举例:

项目代码块:

public boolean copyHomeDatabase() throws IOException {
        boolean b = false;
        //创建路径
        File f = new File(sDatabasePath);
        if (!f.exists()) {
            f.mkdirs();
        }
        //创建文件句柄 String HOME_DB_NAME = "myhome.db";
        File homedbFile = new File(sDatabasePath + Constant.HOME_DB_NAME);
        b = isHomeDBExists(homedbFile);
        //如果数据库不存在,则拷贝
        if (!b) {
            //获取/res/raw/myhome.zip目录中的压缩包资源的二进制文件流
            InputStream is = context.getResources().openRawResource(R.raw.home);
            //ZipInputStream “压缩文件输入流” 用于读取ZIP格式的压缩文件
            //这里使用了缓冲区进行数据的操作,因此使用了字节缓冲区流类BufferedInputStream
            ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));

            ZipEntry entry;
            //getNextEntry():读取下一个ZIP文件条目并将该流定位在条目数据的开头
            while ((entry = zis.getNextEntry()) != null) {
                //getName():返回条目的名称
                String name =entry.getName();
                if (TextUtils.isEmpty(name)||name.contains("../")){
                    continue;
                }
                int size;
                byte[] buffer = new byte[1024 * 2];
                OutputStream fos = 
                          new FileOutputStream(sDatabasePath + entry.getName());
                BufferedOutputStream bos = 
                          new BufferedOutputStream(fos, buffer.length);
                //将数据流读入到数组buffer中
                while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
                    //从buffer数组中将数据写入到文件
                    bos.write(buffer, 0, size);
                }
                bos.flush();
                bos.close();
            }
            zis.close();
            is.close();
        }
        return !b;
    }
package com.company;
 
import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
 
class unzip{
    byte doc[]=null;
    String filename=null;
    String unzipath=null;
    public unzip(String filename,String unzipath)
    {
        this.filename=filename;
        this.unzipath=unzipath;
    }
    public void dounzip()
    {
        try{
            //这里filename是文件名,如xxx.zip
           ZipInputStream zipis=new ZipInputStream(new FileInputStream(filename));
           ZipEntry fentry=null;
           while((fentry=zipis.getNextEntry())!=null){
                //fentry逐个读取zip中的条目,第一个读取的名称为test。
                //test条目是文件夹,因此会创建一个File对象,File对象接收的参数为地址
                //然后就会用exists,判断该参数所指定的路径的文件或者目录是否存在
                //如果不存在,则构建一个文件夹;若存在,跳过
                //如果读到一个zip,也继续创建一个文件夹,然后继续读zip里面的文件,如txt
                if(fentry.isDirectory()){
                    File dir = new File(unzipath+fentry.getName());
                    if(!dir.exists()){
                        dir.mkdirs();
                    }
                }
                else {
                    //fname是文件名,fileoutputstream与该文件名关联
                    String fname=new String(unzipath+fentry.getName());
                    try{
                        //新建一个out,指向fname,fname是输出地址
                        FileOutputStream out = new FileOutputStream(fname);
                        doc=new byte[512];
                        int n;
                        //若没有读到,即读取到末尾,则返回-1
                        while((n=zipis.read(doc,0,512))!=-1)
                        {
                            //这就把读取到的n个字节全部都写入到指定路径了
                            out.write(doc,0,n);
                            //System.out.println(n);
                        }
                        out.close();
                        out=null;
                        doc=null;
                    }catch (Exception ex) {
                        System.out.println("there is a problem");
                    }
                }
            }
            zipis.close();
        }catch (IOException ioex){ System.out.println("io错误:"+ioex);}
        System.out.println("finished!");
    }
}
public class unzipTester {
   public static void main(String[]args)throws IOException,ClassNotFoundException{
        String zipFile=args[0];
        String unzipPath=args[1];
        unzip myzip=new unzip(zipFile,unzipPath);
        myzip.dounzip();
   }
}

关于关于缓冲区流,又可以分为字节缓冲区流和字符缓冲区流,请参见下一篇文章!
 

发布了9 篇原创文章 · 获赞 0 · 访问量 1431

猜你喜欢

转载自blog.csdn.net/luqingshuai_eloong/article/details/104228918
今日推荐