java zip打包

<p>
额,这是我的第一篇博客,可能写得不是太好,希望阅读到此篇文章的博友们能够理解与支持。</p><p><span style="white-space: pre;">	</span>好了,进入正题,我也是一只刚入门的菜鸟,对与各种技术都充满了好奇,也热衷于java啦,对于zip打包。不知道小伙伴们是否也和我一样认为 java 须要第三方jar包才能完成呢?好奇的我,首选百度找啦,当然,这一类的技术文章不少的,于是我也就随便看了一章。怎么说呢看完后我只知道java本身就有了zip打包的支持,其实知道这个也就够了。</p><p>接下来就是靠自己慢慢琢磨和看文档的过程啦。</p><p><span style="white-space: pre;">	</span>其实,zip打包还是相当容易的,我相信有点基础的人都是能看的懂的啦,好啦,直接上源码。</p><div>
</div>
</pre><pre name="code" class="java">package com.zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipEncoder {
	static FileInputStream fis;
	static FileOutputStream fos;
	static ZipOutputStream zos;
	
	/**
	 * 
	 * @param src
	 * 需要打包的文件路径,如:E:/test 或,E:/test/ 或 E:/test.txt;
	 * 前两者表示打包 test 目录,后者表示打包 test.txt 文件
	 * @param dest
	 * 压缩文件的存放路径,如:E:/test.zip
	 * 
	 */
	
	public static void encode(String src,String dest){
		File zipfile=new File(dest);
		File srcfile=new File(src);
		if(!srcfile.exists()){
			System.out.println("源文件不存在");
			return;
		}
		int i=1;
		
		//循环判读  要存的文件名是否已存在。
		while(zipfile.exists()){
			if(dest.indexOf("(")!=-1&&dest.indexOf(")")!=-1){
				i++;
				dest=dest.substring(0,dest.lastIndexOf("("))+"("+i+").zip";
			}else{
				dest=dest.substring(0,dest.lastIndexOf(".zip"))+"(1).zip";
			}
			zipfile=new File(dest);
		}
		try {
			
			 fos=new FileOutputStream(zipfile);
			 zos=new ZipOutputStream(fos);
			 String base=null;
			 if(srcfile.isDirectory()){
				
				if(src.endsWith("/")){
					src=src.substring(0,src.lastIndexOf("/"));
					if(src.indexOf("/")!=-1){
						base=src.substring(src.lastIndexOf("/")+1,src.length())+"/";
					}
					else{
						base=src+"/";
					}
					
					
				}else{
					base=src.substring(src.lastIndexOf("/")+1,src.length())+"/";
				}
			 }else{
				 base="";
			 }
			
			 System.out.println("开始压缩...");
			 long begin=System.currentTimeMillis();
			 list(srcfile,base);
			 long end=System.currentTimeMillis();
			 System.out.println("用时:"+((end-begin)/1000+1)+"秒");
			 System.out.println("压缩完成!!!");
			 
			 zos.close();
			 fos.close();
			 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	private static void list(File file,String base){
		if(file.exists()){
			if(file.isDirectory()){
				File[] files=file.listFiles();
				if(files==null||files.length<1){
					
					return;
				}
				for(File f:files)
				if(f.isDirectory()){
					list(f,base+f.getName()+"/");
				}
				
				else{
					
					 try {
						fis=new FileInputStream(f);
						ZipEntry zipEntry=new ZipEntry(base+f.getName());
						  zos.putNextEntry(zipEntry);
						  byte[] buf=new byte[1024*10];
						  int len=0;
						  System.out.println("正在压缩"+base+f.getName());
						  while((len=fis.read(buf))!=-1){
							  zos.write(buf, 0,len);
							  zos.flush();
							  //Thread.sleep(10);
							  
						  }
						 
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}finally{
						try {
							fis.close();
							zos.closeEntry();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
			}
			else{
				try {
					fis=new FileInputStream(file);
					ZipEntry zipEntry=new ZipEntry(base+file.getName());
					  zos.putNextEntry(zipEntry);
					  byte[] buf=new byte[1024*10];
					  int len=0;
					  System.out.println("正在压缩"+base+file.getName());
					  while((len=fis.read(buf))!=-1){
						  zos.write(buf, 0,len);
						  zos.flush();
						  //Thread.sleep(10);
					  }
					  
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally{
					try {
						fis.close();
						zos.closeEntry();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
		
	}
	
	
}
</pre><pre name="code" class="java">代码写的不是很好看,但还是好用的,也没讲究什么效率问题,能达到目的是我现在最大的目标。好拉,说说新手要注意的一些问题吧。
一、带目录一起打包,
<span style="white-space:pre">	</span>怎么说呢,也是一个小问题啦,但对于新手来说。不是值得一提的。记得哦,要得上目录一起打包,一定了加上文件路径一起,嗯 ,具体就看源码吧。源码中base是要打包的目录的名称。
</pre><pre name="code" class="java">二、各种输入输出流一定要关闭
</pre><pre name="code" class="java"><span style="white-space:pre">	</span>暂且不说安全问题,就程序正确性来说,也强烈要求关闭流。
三、flush
<span style="white-space:pre">	</span>一定要记得zos写入后一定要flush一下,否则会有你想不到的结果。
</pre><pre name="code" class="java">好了,就这么滴吧。希望能对你有用。
</pre><pre name="code" class="java">对了。附上测试代码
</pre><pre name="code" class="java"><pre name="code" class="java">package com.zip;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String src="E:/2014-03-22微信开发入门";
		String dest="E:/test.zip";
		ZipEncoder.encode(src, dest);
	}

}


 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值