如果目录进入点是一个文件夹,在命名时必须以路径分隔符结尾,在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对文件的压缩与解压的详细内容。
