惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
爱范儿
爱范儿
量子位
Martin Fowler
Martin Fowler
V
V2EX
博客园 - 三生石上(FineUI控件)
I
InfoQ
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
Netflix TechBlog - Medium
D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
U
Unit 42
Apple Machine Learning Research
Apple Machine Learning Research
H
Help Net Security
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
Engineering at Meta
Engineering at Meta

博客园 - 新一

HPUX 大文件系统扩容 LESS详解之函数(四) Win7 安装Apache 2.2.4报错:<OS 5>拒绝访问. :Failed to open the WinNT service manager java后台进程和线程优先级 在Linux下用源码编译安装apache2 线程池技术 Red Hat dhclient [置顶] 开关电源的pcb设计规范 javascript 的一些理解和随笔 动态规划之 <筷子> 都是权限惹的祸! [LeetCode] Validate Binary Search Tree 解决IE6-IE8 Js代码不执行问题 linux下chmod使用 熬之滴水成石:最想深入了解的内容--windows内核机制(6) linux网络设备—PHY linux网络设备—mdio总线 通过action传过来的值在option获取进行验证 屌丝也用按位与(&),按位或(|) (二)
Java IO--压缩流
新一 · 2013-11-14 · via 博客园 - 新一

压缩流:


压缩流的实现:


zipEntry:


在实例化ZipEntry的时候,要设置名称,此名称实际上就是压缩文件中的每一个元素的名称。

ZipOutputStream:



import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipOutputStream ;
import java.io.FileOutputStream ;
public class ZipOutputStreamDemo01{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		File file = new File("d:" + File.separator + "mldn.txt") ;	// 定义要压缩的文件
		File zipFile = new File("d:" + File.separator + "mldn.zip") ;	// 定义压缩文件名称
		InputStream input = new FileInputStream(file) ;	// 定义文件的输入流
		ZipOutputStream zipOut = null ;	// 声明压缩流对象
		zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
		zipOut.putNextEntry(new ZipEntry(file.getName())) ;	// 设置ZipEntry对象
		zipOut.setComment("www.mldnjava.cn") ;	// 设置注释
		int temp = 0 ;
		while((temp=input.read())!=-1){	// 读取内容
			zipOut.write(temp) ;	// 压缩输出
		}
		input.close() ;	// 关闭输入流
		zipOut.close() ;	// 关闭输出流
	}
};

以上的操作只是完成了一个文件的压缩,如果要完成一个文件夹的压缩呢?

压缩一个文件夹:


import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipOutputStream ;
import java.io.FileOutputStream ;
public class ZipOutputStreamDemo02{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		File file = new File("d:" + File.separator + "mldn") ;	// 定义要压缩的文件夹
		File zipFile = new File("d:" + File.separator + "mldndir.zip") ;	// 定义压缩文件名称
		InputStream input = null ;	// 定义文件输入流
		ZipOutputStream zipOut = null ;	// 声明压缩流对象
		zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
		zipOut.setComment("www.mldnjava.cn") ;	// 设置注释
		int temp = 0 ;
		if(file.isDirectory()){	// 判断是否是文件夹
			File lists[] = file.listFiles() ;	// 列出全部文件
			for(int i=0;i<lists.length;i++){
				input = new FileInputStream(lists[i]) ;	// 定义文件的输入流
				zipOut.putNextEntry(new ZipEntry(file.getName()
					+File.separator+lists[i].getName())) ;	// 设置ZipEntry对象
				while((temp=input.read())!=-1){	// 读取内容
					zipOut.write(temp) ;	// 压缩输出
				}
				input.close() ;	// 关闭输入流
			}
		}
		zipOut.close() ;	// 关闭输出流
	}
};

ZipFile:


ZipFile在实例化的时候必须接收File类的实例,此File类的实例是指向一个压缩的*.zip文件。

为ZipFile实例化:

import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipOutputStream ;
import java.util.zip.ZipFile ;
import java.io.FileOutputStream ;
public class ZipFileDemo01{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		File file = new File("d:" + File.separator + "mldn.zip") ;	// 找到压缩文件
		ZipFile zipFile = new ZipFile(file) ;	// 实例化ZipFile对象
		System.out.println("压缩文件的名称:" + zipFile.getName()) ;	// 得到压缩文件的名称
	}
};

通过ZipFile文件,为mldn.zip进行解压缩操作。

import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.io.OutputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipOutputStream ;
import java.util.zip.ZipFile ;
import java.io.FileOutputStream ;
public class ZipFileDemo02{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		File file = new File("d:" + File.separator + "mldn.zip") ;	// 找到压缩文件
		File outputFile = new File("d:" + File.separator + "mldn_unzip.txt") ; // 定义解压缩的文件名称
		ZipFile zipFile = new ZipFile(file) ;	// 实例化ZipFile对象
		ZipEntry entry = zipFile.getEntry("mldn.txt") ;	// 得到一个压缩实体
		OutputStream out = new FileOutputStream(outputFile) ; // 实例化输出流
		InputStream input = zipFile.getInputStream(entry) ;	// 得到一个压缩实体的输入流
		int temp = 0 ;
		while((temp=input.read())!=-1){
			out.write(temp) ;
		}
		input.close() ;	// 关闭输入流
		out.close() ;	// 关闭输出流
	}
};

以上的操作操作中,有一个问题,必须知道压缩文件中的每一个压缩实例的名称才可以进行解压缩操作,而如果现在假设是一个文件夹呢?

ZipInputStream:

定义:



import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipInputStream ;
import java.io.FileInputStream ;
public class ZipInputStreamDemo01{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		File zipFile = new File("d:" + File.separator + "mldn.zip") ;	// 定义压缩文件名称
		ZipInputStream input = null ;	// 定义压缩输入流
		input = new ZipInputStream(new FileInputStream(zipFile)) ;	// 实例化ZIpInputStream
		ZipEntry entry = input.getNextEntry() ;	// 得到一个压缩实体
		System.out.println("压缩实体名称:" + entry.getName()) ;
		input.close() ;
	}
};

import java.io.File ;
import java.io.OutputStream ;
import java.io.InputStream ;
import java.util.zip.ZipEntry ;
import java.util.zip.ZipFile ;
import java.util.zip.ZipInputStream ;
import java.io.FileInputStream ;
import java.io.FileOutputStream ;
public class ZipInputStreamDemo02{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		File file = new File("d:" + File.separator + "mldndir.zip") ;	// 定义压缩文件名称
		File outFile = null ;	// 输出文件的时候要有文件夹的操作
		ZipFile zipFile = new ZipFile(file) ;	// 实例化ZipFile对象
		ZipInputStream zipInput = null ;	// 定义压缩输入流
		OutputStream out = null ;	// 定义输出流,用于输出每一个实体内容
		InputStream input = null ;	// 定义输入流,读取每一个ZipEntry
		ZipEntry entry = null ;	// 每一个压缩实体
		zipInput = new ZipInputStream(new FileInputStream(file)) ;	// 实例化ZIpInputStream
		while((entry = zipInput.getNextEntry())!=null){	// 得到一个压缩实体
			System.out.println("解压缩" + entry.getName() + "文件。") ;
			outFile = new File("d:" + File.separator + entry.getName()) ;	// 定义输出的文件路径
			if(!outFile.getParentFile().exists()){	// 如果输出文件夹不存在
				outFile.getParentFile().mkdir() ;	// 创建文件夹
			}
			if(!outFile.exists()){	// 判断输出文件是否存在
				outFile.createNewFile() ;	// 创建文件
			}
			input = zipFile.getInputStream(entry) ;	// 得到每一个实体的输入流
			out = new FileOutputStream(outFile) ;	// 实例化文件输出流
			int temp = 0 ;
			while((temp=input.read())!=-1){
				out.write(temp) ;
			}
			input.close() ;		// 关闭输入流
			out.close() ;	// 关闭输出流
		}
		input.close() ;
	}
};

总结: