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();
}
}
关于关于缓冲区流,又可以分为字节缓冲区流和字符缓冲区流,请参见下一篇文章!