Java IO流中的 压缩流的使用
前言
最近刚学IO流 - -、 ,本来是结束了IO的基本学习,发现有个压缩流。闲来无事,随便看看。 在次记录 若有错误,希望大家指出。
从网上查阅资料,java io支持三种格式,压缩文件大概就为 ZIP、JAR、GZ这些。在这里我只讲ZIP格式的,其他格式的好像特性跟ZIP的格式都差不多 大家有兴趣可以去试一下
好像只需要掌握这四个类 压缩解压 就没什么问题。
所需要了解的类
-
ZipEntry
-
- 压缩解压都需要用到的类.
- 每压缩一个文件(夹)的时候 输出流都需要添加一个这个类
- 每解压一个文件(夹)的时候 解压出的都是该类接收
- 不知道说的准不准确 反正我个人觉着就是一个文件(夹)对应着一个对象,这里看不懂的话可以看代码摸索一下
- 用上的方法:
1. public ZipEntry(String name) 构造函数 就是设置你所压缩的文件名称为xx (name值)
2. public boolean isDirectory() 返回布尔值 判断ZipEntry是否为文件夹
ZipOutputStream
-
- 用上的方法:
1. public ZipOutputStream(OutputStream out) 构造函数 传入个字节输出流
2. public void putNextEntry(ZipEntry e) 开始编写新的ZIP文件条目,并将流定位到条目数据的开头。 这个方法是写入一个文件(夹) 看不懂的可以稍后看代码
ZipInputStream
- 用上的方法:
-
- 用上的方法:
1. public ZipInputStream(InputStream out) 构造函数 传入个字节输入流
2. public ZipEntry getNextEntry() 读取下一个ZIP文件条目,并将流定位在条目数据的开头。没有则返回null
ZipFile
- 用上的方法:
-
- 用上的方法:
1. public ZipFile(File file) 构造函数 打开一个ZIP文件,读取指定的File对象。传入你需要解压的文件
2. public InputStream getInputStream(ZipEntry entry) 返回用于读取指定zip文件条目内容的输入流。 这个是根据一个压缩类文件 ZipEntry 来返回一个输入流
- 用上的方法:
简单介绍了一下这些用的上的类 而且我只会简单的压缩、解压 = - = 还有其他没说上的方法 大家可以自己去查阅一下api文档
话不多说直接上代码
压缩文件
public static void compressedAllZip(){
//源文件 输入自己需要解压的文件或目录
File sourceFile = new File("c:prcture");
//目的文件 输入自己需要解压的目录
File purposeFile = new File("c:picture.zip");
ZipOutputStream zos = null;
try {
//实例化
zos = new ZipOutputStream(new FileOutputStream(purposeFile));
Zip(zos,sourceFile,sourceFile.getName());
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源 代码在下面
myClose(zos,null);
}
}
/**
* 将要压缩的文件和文件名放入
* @param zos 压缩输出流
* @param file 所要压缩的文件
* @param name 所要压缩的文件名称
*/
public static void Zip(ZipOutputStream zos,File file,String name) throws IOException {
//判断传来文件是否是文件夹
if(file.isDirectory()){
//创建文件夹
zos.putNextEntry(new ZipEntry(name+File.separator));
//将文件夹中的文件取出,遍历
File[] files = file.listFiles();
for (File f:files) {
//递归
Zip(zos,f,name+File.separator+f.getName());
}
}else{
//将文件写入压缩包中
zos.putNextEntry(new ZipEntry(name));
//实例化源文件
FileInputStream fis = new FileInputStream(file);
int i = 0;
byte[] bytes = new byte[1024];
while((i = fis.read(bytes)) != -1){
zos.write(bytes,0,i);
}
fis.close();
}
}
解压文件
解压文件就麻烦很多 - - 刚开始看的时候有点晕 多看几遍就看懂了
public static void unzip(){
//压缩文件的上级目录
String url = "C:"+File.separator+"Users"+File.separator+"Administrator"+File.separator+"Desktop"+File.separator+"日常文件"+File.separator+"IO流及File"+File.separator+"ZipStream"+File.separator;
File file = new File(url+"picture.zip") ; // 定义压缩文件
File outFile = null; // 输出文件的时候要有文件夹的操作
ZipFile zipFile = null; // 实例化ZipFile对象
try {
zipFile = new ZipFile(file);
} catch (IOException e) {
new FileNotFoundException("找不到该文件");
}
ZipInputStream zipInput = null ; // 定义压缩输入流
OutputStream out = null ; // 定义输出流,用于输出每一个实体内容
InputStream input = null; // 定义输入流,读取每一个ZipEntry
ZipEntry entry = null ; // 每一个压缩实体
try {
zipInput = new ZipInputStream(new FileInputStream(file)); // 实例化ZIpInputStream
while ((entry = zipInput.getNextEntry()) != null) { // 得到一个压缩实体
System.out.println("解压缩" + entry.getName() + "文件");
outFile = new File(url + entry.getName()); // 定义输出的文件路径
if(entry.isDirectory()){
outFile.mkdir();
continue;
}
try {
input = zipFile.getInputStream(entry); // 得到每一个实体的输入流
out = new FileOutputStream(outFile); // 实例化文件输出流
int i = 0;
byte[] bytes = new byte[1024];
while ((i = input.read(bytes)) != -1) {
out.write(bytes,0,i);
}
}finally {
myClose(out,input); // 关闭输入输出流
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
myClose(null,zipInput); // 关闭输入输出流
}
}
最后是个关闭流的方法
public static void myClose(OutputStream os,InputStream is){
if(os != null ){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
好了 基本就这些了。第一次使用,如有使用不当,请指出 我来修改
原文地址为 :https://blog.youkuaiyun.com/u013087513/article/details/52151227