JAVA对文件进行压缩和解压

java中经常要对一些文件压缩

一 、导包

<!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->
<dependency>
    <groupId>org.apache.ant</groupId>
    <artifactId>ant</artifactId>
    <version>1.10.7</version>
</dependency>

二、设置压缩文件格式

在类中定义缓存层和编码格式

	private static byte[] _byte = new byte[1024];
	
	private static final String ENCODE_UTF_8 = "UTF-8";

定义方法

	/**
     * 压缩文件和路径
     * @param zip 压缩文件输出的地址  例如:D://test.zip
     * @param srcFiles 要压缩的源文件集合
     */
    public static void zipFile( String zip , List<File> srcFiles ){
        try {
            //判断是否为压缩后的文件后缀是否为.zip结尾
            if( zip.endsWith(".zip") || zip.endsWith(".ZIP") ){
                //创建压缩文件输出流
                ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(new File(zip))) ;
                //设置编码
                _zipOut.setEncoding(ENCODE_UTF_8);
                //迭代多个压缩文件
                for( File _f : srcFiles ){
                    //执行压缩
                    zipFile(zip , _zipOut , _f , "");
                }
                _zipOut.close();
            }else{
                System.out.println("target file[" + zip + "] is not .zip type file");
            }
        } catch (FileNotFoundException e) {
        	
        } catch (IOException e) {
        }
    }

三、递归确认压缩文件

因为一个文件夹中可能含有多个文件夹和文件所以每次都要去操作相应的文件和文件夹

/**
     * 
     * @param zip 压缩文件输出的地址  例如:D://test.zip
     * @param zipOut 被压缩后的输出流
     * @param srcFile  被压缩的文件
     * @param path  在zip中的相对路径
     * @throws IOException
     */
    private static void zipFile(String zip , ZipOutputStream zipOut , File srcFile , String path ) throws IOException{
        System.out.println(" 开始压缩文件[" + srcFile.getName() + "]");
        if( !"".equals(path) && ! path.endsWith(File.separator)){
            path += File.separator ;
        }
        //测试此抽象路径名定义的文件或目录是否存在
        if (!srcFile.exists()) {
			System.out.println("压缩失败,文件或目录 " + srcFile + " 不存在!");
		}else{
			if( ! srcFile.getPath().equals(zip) ){
	            if( srcFile.isDirectory() ){//对象是否是文件夹false标识非文件夹
                    //listFiles能够获取当前文件夹下的所有文件和文件夹
                    //及比如我们创建了多层路径D:\压缩文件\压缩二层\压缩三层他可以得到
                    //D:\压缩文件(当前)\压缩二层(当前的下一层)
	                File[] _files = srcFile.listFiles() ;
	                if( _files.length == 0 ){
	                    zipOut.putNextEntry(new ZipEntry( path + srcFile.getName() + File.separator));
	                    zipOut.closeEntry();
	                }else{
	                    for( File _f : _files ){
	                        //递归迭代下一层文件夹中的文件
	                        zipFile( zip ,zipOut , _f , path + srcFile.getName() );
	                    }
	                }
	            }else{
	            	FileInputStream _in = new FileInputStream(srcFile) ;
	            	//设置压缩路径
	                zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
	                int len = 0 ; 
	                while( (len = _in.read(_byte)) > 0  ){
	                    zipOut.write(_byte, 0, len);
	                }
                    //关闭流
	                _in.close();
	                zipOut.closeEntry();
	            }
	        }
		}
    }

四、main方法测试

    public static void main(String[] args) {

        String zip = "D:\\练习压缩.zip";
        List<File> files = new ArrayList<>();
        File file = new File("D:\\压缩文件");
        files.add(file);
    	zipFile(zip, files);
    }

4.1创建对应文件目录1

只在三层下面创建文件
在这里插入图片描述

4.1.1执行结果

 开始压缩文件[压缩文件]
 开始压缩文件[压缩二层]
 开始压缩文件[压缩三层]
 开始压缩文件[三层下面的文件.txt]

对应压缩出的文件
在这里插入图片描述

4.2创建对应文件目录2

在二层同级创建文件和三层下面创建文件
在这里插入图片描述

4.2.1执行结果

 开始压缩文件[压缩文件]
 开始压缩文件[压缩二层]
 开始压缩文件[压缩三层]
 开始压缩文件[三层下面的文件.txt]
 开始压缩文件[压缩二层文件.txt]

对应压缩出的文件

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章