您好,欢迎访问一九零五行业门户网

java对文件的压缩与解压

一 概述1.目录进入点目录进入点是文件在压缩文件中的映射,代表压缩文件。压缩文件时,创建目录进入点,将文件写入该目录进入点。解压时,获取目录进入点,将该目录进入点的内容写入硬盘指定文件。
如果目录进入点是一个文件夹,在命名时必须以路径分隔符结尾,在window操作系统中名称分隔符为“/”。
2.文件的自动创建无论是调用createnewfile()创建文件,还是在创建输出流时由输出流负责创建文件,都必须保证父路径已经存在,否则文件无法创建。
3.目录的创建mkdirs():创建多级目录。
mkdir():创建一级目录,如果父路径不存在,创建失败。
二 压缩1.创建目录进入点首先为文件或者文件夹创建目录进入点,目录进入点的名称为当前文件相对于压缩文件的路径,文件夹的目录进入点名称必须以名称分隔符结尾,以区别于文件。
zipentry entry = new zipentry(压缩文件夹名称 + file.separator+文件或文件夹路径);
2.写入目录进入点使用zipoutputstream输出流将文件写入对应目录进入点中,写入完成,关闭目录进入点。
3.demopackage com.javase.io;import java.io.file;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.util.zip.zipentry;import java.util.zip.zipinputstream;import java.util.zip.zipoutputstream;public class ziputils {/** * 压缩一个文件夹      *       * @throws ioexception     */public void zipdirectory(string path) throws ioexception {         file file = new file(path);         string parent = file.getparent();         file zipfile = new file(parent, file.getname() + .zip);         zipoutputstream zos = new zipoutputstream(new fileoutputstream(zipfile));         zip(zos, file, file.getname());         zos.flush();         zos.close();     }/** *       * @param zos      *            压缩输出流      * @param file      *            当前需要压缩的文件      * @param path      *            当前文件相对于压缩文件夹的路径      * @throws ioexception     */private void zip(zipoutputstream zos, file file, string path) throws ioexception {// 首先判断是文件,还是文件夹,文件直接写入目录进入点,文件夹则遍历if (file.isdirectory()) {             zipentry entry = new zipentry(path + file.separator);// 文件夹的目录进入点必须以名称分隔符结尾            zos.putnextentry(entry);             file[] files = file.listfiles();for (file x : files) {                 zip(zos, x, path + file.separator + x.getname());             }         } else {             fileinputstream fis = new fileinputstream(file);// 目录进入点的名字是文件在压缩文件中的路径zipentry entry = new zipentry(path);             zos.putnextentry(entry);// 建立一个目录进入点int len = 0;byte[] buf = new byte[1024];while ((len = fis.read(buf)) != -1) {                 zos.write(buf, 0, len);             }             zos.flush();             fis.close();             zos.closeentry();// 关闭当前目录进入点,将输入流移动下一个目录进入点        }     }}
三 解压文件1.基本思路解压文件时,先获取压缩文件中的目录进入点,根据该目录进入点创建文件对象,将目录进入点的内容写入硬盘文件中。
2.demopackage com.javase.io;import java.io.file;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.util.zip.zipentry;import java.util.zip.zipinputstream;import java.util.zip.zipoutputstream;public class ziputils {private string basepath;/** * 解压文件      *       * @param unzip      * @throws ioexception     */public void unzip(string unzip) throws ioexception {         file file = new file(unzip);         basepath = file.getparent();         fileinputstream fis = new fileinputstream(file);         zipinputstream zis = new zipinputstream(fis);         unzip(zis);     }private void unzip(zipinputstream zis) throws ioexception {         zipentry entry = zis.getnextentry();if (entry != null) {             file file = new file(basepath + file.separator + entry.getname());if (file.isdirectory()) {// 可能存在空文件夹if (!file.exists())                     file.mkdirs();                 unzip(zis);             } else {                 file parentfile = file.getparentfile();if (parentfile != null && !parentfile.exists())                     parentfile.mkdirs();                 fileoutputstream fos = new fileoutputstream(file);// 输出流创建文件时必须保证父路径存在int len = 0;byte[] buf = new byte[1024];while ((len = zis.read(buf)) != -1) {                     fos.write(buf, 0, len);                 }                 fos.flush();                 fos.close();                 zis.closeentry();                 unzip(zis);             }         }     } }
程序实现了zip压缩。共分为2部分 : 压缩(compression)与解压(decompression)
大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。 
package com.han; import java.io.*; import java.util.zip.*; /** * 程序实现了zip压缩。共分为2部分 : 压缩(compression)与解压(decompression) * <p> * 大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。 * <p> * 在本段代码中,实现的是压缩部分;解压部分见本包中decompression部分。 * * @author han * */ public class myzipcompressing { private int k = 1; // 定义递归次数变量 public myzipcompressing() { // todo auto-generated constructor stub } /** * @param args */ public static void main(string[] args) { // todo auto-generated method stub myzipcompressing book = new myzipcompressing(); try { book.zip("c:\\users\\gaowen\\desktop\\ziptestcompressing.zip", new file("c:\\users\\gaowen\\documents\\tencent files")); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } } private void zip(string zipfilename, file inputfile) throws exception { system.out.println("压缩中..."); zipoutputstream out = new zipoutputstream(new fileoutputstream( zipfilename)); bufferedoutputstream bo = new bufferedoutputstream(out); zip(out, inputfile, inputfile.getname(), bo); bo.close(); out.close(); // 输出流关闭 system.out.println("压缩完成"); } private void zip(zipoutputstream out, file f, string base, bufferedoutputstream bo) throws exception { // 方法重载 if (f.isdirectory()) { file[] fl = f.listfiles(); if (fl.length == 0) { out.putnextentry(new zipentry(base + "/")); // 创建zip压缩进入点base system.out.println(base + "/"); } for (int i = 0; i < fl.length; i++) { zip(out, fl[i], base + "/" + fl[i].getname(), bo); // 递归遍历子文件夹 } system.out.println("第" + k + "次递归"); k++; } else { out.putnextentry(new zipentry(base)); // 创建zip压缩进入点base system.out.println(base); fileinputstream in = new fileinputstream(f); bufferedinputstream bi = new bufferedinputstream(in); int b; while ((b = bi.read()) != -1) { bo.write(b); // 将字节流写入当前zip目录 } bi.close(); in.close(); // 输入流关闭 } } }
package com.han; import java.io.*; import java.util.zip.*; /** * 程序实现了zip压缩。共分为2部分 : * 压缩(compression)与解压(decompression) * <p> * 大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 * 需在代码中自定义源输入路径和目标输出路径。 * <p> * 在本段代码中,实现的是解压部分;压缩部分见本包中compression部分。 * @author han * */ public class copyofmyzipdecompressing { public static void main(string[] args) { // todo auto-generated method stub long starttime=system.currenttimemillis(); try { zipinputstream zin=new zipinputstream(new fileinputstream( "c:\\users\\han\\desktop\\stock\\spectrecompressed.zip"));//输入源zip路径 bufferedinputstream bin=new bufferedinputstream(zin); string parent="c:\\users\\han\\desktop"; //输出路径(文件夹目录) file fout=null; zipentry entry; try { while((entry = zin.getnextentry())!=null && !entry.isdirectory()){ fout=new file(parent,entry.getname()); if(!fout.exists()){ (new file(fout.getparent())).mkdirs(); } fileoutputstream out=new fileoutputstream(fout); bufferedoutputstream bout=new bufferedoutputstream(out); int b; while((b=bin.read())!=-1){ bout.write(b); } bout.close(); out.close(); system.out.println(fout+"解压成功"); } bin.close(); zin.close(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } catch (filenotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } long endtime=system.currenttimemillis(); system.out.println("耗费时间: "+(endtime-starttime)+" ms"); } }
以上就是java对文件的压缩与解压的详细内容。
其它类似信息

推荐信息