<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ursob &#187; java文件压缩</title>
	<atom:link href="http://ursob.org/tag/java%e6%96%87%e4%bb%b6%e5%8e%8b%e7%bc%a9/feed/" rel="self" type="application/rss+xml" />
	<link>http://ursob.org</link>
	<description>Code &#38;&#38; Riff</description>
	<lastBuildDate>Thu, 29 Jul 2010 09:37:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java文件压缩下载</title>
		<link>http://ursob.org/2009/09/25/struts-packaging-download/</link>
		<comments>http://ursob.org/2009/09/25/struts-packaging-download/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 07:25:15 +0000</pubDate>
		<dc:creator>ripflowers</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Others]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[javaWeb]]></category>
		<category><![CDATA[java文件压缩]]></category>
		<category><![CDATA[Struts]]></category>

		<guid isPermaLink="false">http://ursob.org/?p=120</guid>
		<description><![CDATA[上文书中说到struts的文件批量上传，接下来总结一下java中文件的压缩下载功能，既把文件打成压缩包然后下载，实现中使用了org.apache.tools.zip.ZipEntry以及org.apache.tools.zip.ZipOutputStream这两个主要的类，所以你的项目中必须引入ant.jar这个包，java中也自带了关于压缩文件操作的类，但之所以不用java自带的，是因为ant.jar中的操作类解决了文件名是中文的问题，也就是说java自带的那个类在处理中文名文件的时候会抛出异常，现在的版本只支持文件的打包，还不支持文件目录的打包。这里的文件压缩功能是针对java Web开发的，最重要的是解决的思路，有了思路就到那都可以解决了。]]></description>
			<content:encoded><![CDATA[<p>承接上文，上文书中说到struts的文件批量上传，接下来总结一下java中文件的压缩下载功能，既把文件打成压缩包然后下载，实现中使用了org.apache.tools.zip.ZipEntry以及org.apache.tools.zip.ZipOutputStream这两个主要的类，所以你的项目中必须引入ant.jar这个包，java中也自带了关于压缩文件操作的类，但之所以不用java自带的，是因为ant.jar中的操作类解决了文件名是中文的问题，也就是说java自带的那个类在处理中文名文件的时候会抛出异常，现在的版本只支持文件的打包，还不支持文件目录的打包。这里的文件压缩功能是针对java Web开发的，最重要的是解决的思路，有了思路就到那都可以解决了。<br />
还是用代码来说话，代码中会嵌入一些注释。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:Courier New, Courier;"><span style="color: #66cc66;">//</span>文件打包下载
public ActionForward downLoadFiles<span style="color: #66cc66;">&#40;</span>ActionMapping mapping<span style="color: #66cc66;">,</span> ActionForm form<span style="color: #66cc66;">,</span>
		HttpServletRequest request<span style="color: #66cc66;">,</span> HttpServletResponse response<span style="color: #66cc66;">&#41;</span>
		throws Exception <span style="color: #66cc66;">&#123;</span>
	try <span style="color: #66cc66;">&#123;</span>
		<span style="color: #808080; font-style: italic;">/**这个集合就是你想要打包的所有文件，
		 * 这里假设已经准备好了所要打包的文件*/</span>
		List<span style="color: #66cc66;">&lt;</span>File<span style="color: #66cc66;">&gt;</span> files <span style="color: #66cc66;">=</span> new ArrayList<span style="color: #66cc66;">&lt;</span>File<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">/**创建一个临时压缩文件，
		 * 我们会把文件流全部注入到这个文件中
		 * 这里的文件你可以自定义是.rar还是.zip*/</span>
		File file <span style="color: #66cc66;">=</span> new File<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;yourPath.rar&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>!file<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">EXISTS</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>   
            file<span style="color: #66cc66;">.</span>createNewFile<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;   
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #808080; font-style: italic;">/**要是弹出那个下载的框，
         * 就必须有下边这两项的设置了*/</span>
        response<span style="color: #66cc66;">.</span>addHeader<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Content-Disposition&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;attachment; filename=&quot;</span>
				<span style="color: #66cc66;">+</span> new String<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">.</span>getName<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">.</span>getBytes<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;iso-8859-1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		response<span style="color: #66cc66;">.</span>setContentType<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;application/octet-stream&quot;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">//</span>创建文件输出流
        FileOutputStream fous <span style="color: #66cc66;">=</span> new FileOutputStream<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;   
        <span style="color: #808080; font-style: italic;">/**打包的方法我们会用到ZipOutputStream这样一个输出流,
         * 所以这里我们把输出流转换一下*/</span>
        org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream zipOut 
        	<span style="color: #66cc66;">=</span> new org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream<span style="color: #66cc66;">&#40;</span>fous<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">/**这个方法接受的就是一个所要打包文件的集合，
         * 还有一个ZipOutputStream*/</span>
        FileUtil<span style="color: #66cc66;">.</span>zipFile<span style="color: #66cc66;">&#40;</span>files<span style="color: #66cc66;">,</span> zipOut<span style="color: #66cc66;">&#41;</span>;
        zipOut<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        fous<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">/**直到文件的打包已经成功了，
         * 文件的打包过程被我封装在FileUtil.zipFile这个静态方法中，
         * 稍后会呈现出来，接下来的就是往客户端写数据了*/</span>
        OutputStream out <span style="color: #66cc66;">=</span> response<span style="color: #66cc66;">.</span>getOutputStream<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        BufferedInputStream bin <span style="color: #66cc66;">=</span> new 
        BufferedInputStream<span style="color: #66cc66;">&#40;</span>new FileInputStream<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">.</span>getPath<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        byte<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> buf <span style="color: #66cc66;">=</span> new byte<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">&#93;</span>;
        int len <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;
        while<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>len <span style="color: #66cc66;">=</span> bin<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">READ</span><span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> 
        out<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">WRITE</span><span style="color: #66cc66;">&#40;</span>buf<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span>len<span style="color: #66cc66;">&#41;</span>;
        out<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        bin<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">/**最后的操作是把创建的临时文件删除*/</span>
        try <span style="color: #66cc66;">&#123;</span>
        	File f <span style="color: #66cc66;">=</span> new File<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">.</span>getPath<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        	f<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">DELETE</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #993333; font-weight: bold;">NULL</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #993333; font-weight: bold;">NULL</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>下边是FileUtil中的生成rar或者是zip文件的方法：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:Courier New, Courier;"><span style="color: #808080; font-style: italic;">/**
 * 把接受的全部文件打成压缩包 
 * @param List&lt;File&gt;;  
 * @param org.apache.tools.zip.ZipOutputStream  
 */</span>
public static void zipFile
		<span style="color: #66cc66;">&#40;</span>List files<span style="color: #66cc66;">,</span>org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream outputStream<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	int size <span style="color: #66cc66;">=</span> files<span style="color: #66cc66;">.</span>size<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #66cc66;">&#40;</span>int i <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>; i <span style="color: #66cc66;">&lt;</span> size; i<span style="color: #66cc66;">++</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		File file <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>File<span style="color: #66cc66;">&#41;</span> files<span style="color: #66cc66;">.</span>get<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;
		zipFile<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">,</span> outputStream<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">/**  
 * 根据输入的文件与输出流对文件进行打包
 * @param File
 * @param org.apache.tools.zip.ZipOutputStream
 */</span>
public static void zipFile<span style="color: #66cc66;">&#40;</span>File inputFile<span style="color: #66cc66;">,</span>
		org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipOutputStream ouputStream<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	try <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">EXISTS</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #808080; font-style: italic;">/**如果是目录的话这里是不采取操作的，
			 * 至于目录的打包正在研究中*/</span>
			<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">.</span>isFile<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				FileInputStream <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">=</span> new FileInputStream<span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">&#41;</span>;
				BufferedInputStream bins <span style="color: #66cc66;">=</span> new BufferedInputStream<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">512</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">//</span>org<span style="color: #66cc66;">.</span>apache<span style="color: #66cc66;">.</span>tools<span style="color: #66cc66;">.</span>zip<span style="color: #66cc66;">.</span>ZipEntry
				ZipEntry entry <span style="color: #66cc66;">=</span> new ZipEntry<span style="color: #66cc66;">&#40;</span>inputFile<span style="color: #66cc66;">.</span>getName<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
				ouputStream<span style="color: #66cc66;">.</span>putNextEntry<span style="color: #66cc66;">&#40;</span>entry<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">//</span> 向压缩文件中输出数据   
				int nNumber;
				byte<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> buffer <span style="color: #66cc66;">=</span> new byte<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">512</span><span style="color: #66cc66;">&#93;</span>;
				while <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>nNumber <span style="color: #66cc66;">=</span> bins<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">READ</span><span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> !<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					ouputStream<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">WRITE</span><span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> nNumber<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">//</span> 关闭创建的流对象   
				bins<span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #993333; font-weight: bold;">IN</span><span style="color: #66cc66;">.</span>close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span> else <span style="color: #66cc66;">&#123;</span>
				try <span style="color: #66cc66;">&#123;</span>
					File<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> files <span style="color: #66cc66;">=</span> inputFile<span style="color: #66cc66;">.</span>listFiles<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #66cc66;">&#40;</span>int i <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>; i <span style="color: #66cc66;">&lt;</span> files<span style="color: #66cc66;">.</span>length; i<span style="color: #66cc66;">++</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
						zipFile<span style="color: #66cc66;">&#40;</span>files<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> ouputStream<span style="color: #66cc66;">&#41;</span>;
					<span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception e<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		e<span style="color: #66cc66;">.</span>printStackTrace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">/**********************END***********************/</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://ursob.org/2009/09/25/struts-packaging-download/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
