Java IO--压缩流ZipOutputStream/ZipInputStream

压缩流:

压缩流的实现:

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() ;
	}
};

总结:

时间: 2024-08-01 12:38:31

Java IO--压缩流ZipOutputStream/ZipInputStream的相关文章

IO压缩流问题,为什么老是出现no current ZIP entry错误

问题描述 我Debug了查了很久··但是还是查不出所以然啦,可能是方法不对什么,请大侠帮帮忙importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.zip.ZipException;importjava.util.zip.ZipOutputStream;imp

Java IO包装流如何关闭

问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: 如下例子代码: 1 2 3   FileInputStream is = new FileInputStream(".");      BufferedInputStream bis = new BufferedInputStream(is);     bis.close(); 从设计模式上

Java IO: 字符流的Piped和CharArray

本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader.PipedWriter.CharArrayReader.CharArrayWriter. PipedReader 原文链接 PipedReader能够从管道中读取字符流.与PipedInputStream类似,不同的是PipedReader读取的是字符而非字节.换句话说,PipedReader用于读取管道中的文本.代码如下: Reader reader = new PipedReader(pipedW

java io对象流问题

问题描述 我把一个对象用Objectoutputstream,对象流写进文本里,然后还写入了一些其他的文字,不是对象,我在读取这个文件的时候读出了这个对象后剩下的文字应该怎么读出来?能换输入流吗?我用Objectinputstream读对象后,再读内容报错了Exceptioninthread"main"java.io.StreamCorruptedException:invalidtypecode:D3 解决方案 解决方案二:再换输入流,怎么定位那个不是对象的字符?一般写入对象,即对象

Java IO: 字符流的Buffered和Filter

本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.BufferedWriter.FilterReader.FilterWriter. BufferedReader 原文链接 BufferedReader能为字符输入流提供缓冲区,可以提高许多IO处理的速度.你可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节.特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多. BufferedReader和BufferedInputStrea

Java IO教程

Java IO 是一套Java用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并由输入产生一些输出.Java为此提供了java.io包. 如果你浏览下java.io包,会对其中各样的类选择感到迷惑.这些类的作用都是什么?对于某个任务该选择哪个类?怎样创建你自己的类做插件?这个手册的目的就是给你介绍这些类是如何组织的,以及怎样使用他们,因此你就不会疑惑需要时怎样选取合适的类,或者是否有一个满足你需求的类已经存在了. Java.io 包的范围 java.io 包并没有涵盖所有输入输出

java IO之 File类+字节流 (输入输出 缓冲流 异常处理)

1. File类 File 路径问题: 上下级文件夹之间使用分隔符分开: 在Windows中分隔符为'\' ,在Unix/Linux中分隔符为'/' 跨平台分隔符: 专业的做法是使用File.separatorChar,这个值会根据系统得到的相应的分隔符. 例:new File("c:"+File.separatorChar+"a.txt"); 注意,如果是使用"\" ,则需要进行转义,写为"\\"才可以     绝对路径与相

在读取流的时候的异常java.io.EOFException

今天一个在学习android的同学遇到了这个问题,上网都是socket方面的,但是他的这个却不是,然后我看了他的代码,因为我自己没有遇到过这个问题 java.io.EOFException:             就是表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败 既然读取的时候意外 的到了尾部,那么是不是流里边就没有内容呢?然后我读他的代码才发现, public InputStream getInputStreamFromUrl(String urlStr)t

Java IO: 流

原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) Java IO流是既可以从中读取,也可以写入到其中的数据流.正如这个系列教程之前提到过的,流通常会与数据源.数据流向目的地相关联,比如文件.网络等等. 流和数组不一样,不能通过索引读写数据.在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件.流仅仅只是一个连续的数据流. 某些类似PushbackInputStream 流的实现允许你将数据重新推回