RT,写Zip压包时发现如果文件夹中有空文件夹,不知道如何打压了.所不太清楚,还请大神看看我代码:
package com.bingco.main; import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** * ZIP文档读取与创建 */ public class Main { public static void main(String[] args) { new Main().method_4(); } private void method_1() { ZipInputStream zipIsm = null; try { //创建输入流对象 zipIsm = new ZipInputStream(Files.newInputStream(Paths.get("C:\\Users\\bingco\\Desktop\\bingco.txt"))); // 获取压缩流中的条目 ZipEntry entry; while ((entry = zipIsm.getNextEntry()) != null) { System.out.println(entry.getName()); // 关闭当前条目的子流 zipIsm.closeEntry(); } if (entry == null) System.out.println("This is not ZIP file or file size is zero!"); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭主流 try { if(zipIsm != null) zipIsm.close(); } catch (IOException e) { } } } private void method_2() { ZipInputStream zipIsm = null; try { zipIsm = new ZipInputStream(Files.newInputStream(Paths.get("C:\\Users\\bingco\\Desktop\\bingco.zip"))); /* * 证明它是递归式的迭代压缩文件目录. 如果迭代到一个文件,那么获取的条目名称是路径加上文件名! */ ZipEntry entry; while((entry = zipIsm.getNextEntry()) != null) { if (entry.isDirectory()) System.out.println("文件夹: " + entry.getName()); else System.out.println("文件: " + entry.getName()); zipIsm.closeEntry(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(zipIsm != null) zipIsm.close(); } catch (IOException e) { } } } private void method_3() { ZipInputStream zipIsm = null; BufferedOutputStream osm = null; /* * 代码解压缩ZIP文件 */ try { zipIsm = new ZipInputStream(Files.newInputStream(Paths.get("C:\\Users\\bingco\\Desktop\\bingco.zip"))); File file = new File("C:\\Users\\bingco\\Desktop\\bingco-zip"); if (!file.exists()) file.mkdirs(); ZipEntry entry; while ((entry = zipIsm.getNextEntry()) != null) { if (entry.isDirectory()) { File f = new File(file, entry.getName()); if (!f.exists()) f.mkdirs(); } else { osm = new BufferedOutputStream(new FileOutputStream(new File(file, entry.getName()))); int len; byte[] by = new byte[1024]; while((len = zipIsm.read(by, 0, by.length)) > 0) { osm.write(by, 0, len); } zipIsm.closeEntry(); osm.close(); } } } catch (IOException e) { e.printStackTrace(); } finally { try { if(zipIsm != null) zipIsm.close(); if(osm != null) osm.close(); } catch (IOException e) {} } } private void method_4() { ZipOutputStream zipOsm = null; File file = new File("C:\\Users\\bingco\\Desktop\\bingco"); if (!file.exists()) { System.out.println("undefined the file or folder !"); return; } try { zipOsm = new ZipOutputStream(new FileOutputStream("C:\\Users\\bingco\\Desktop\\" + file.getName() + ".zip")); String parent = file.getParent() + "\\"; zipPack(file, parent, zipOsm); } catch(IOException e) { e.printStackTrace(); } finally { try { if (zipOsm != null) zipOsm.close(); } catch (IOException e) {} } } private void zipPack(File file, String parent, ZipOutputStream zipOsm) throws IOException { if (file.isFile()) { String entryName = file.getPath().replace(parent, ""); zipOsm.putNextEntry(new ZipEntry(entryName)); BufferedInputStream ism = new BufferedInputStream(new FileInputStream(file.getPath())); try { int len; byte by[] = new byte[1024]; while ((len = ism.read(by, 0, by.length)) > 0) { zipOsm.write(by, 0, len); } zipOsm.closeEntry(); } catch (IOException e) { throw new RuntimeException(e); } finally { if (ism != null) ism.close(); } } else { for (File fe : file.listFiles()) zipPack(fe, parent, zipOsm); } } }
遍历文件,判断是否是文件夹还是文件,是文件夹判断文件夹下是否有内容,如果没有直接写入路径,有则递归。
public void zipDistory(String name,File file,ZipOutputStream zipOut) throws IOException{ File[] f=file.listFiles(); for(File e:f ){ if(e.isDirectory()){ if(e.listFiles().length==0){ zipOut.putNextEntry(new ZipEntry(file.getName()+File.separator+e.getName())); zipOut.closeEntry(); }else{ zipDistory(name+File.separator+file.getName()+file.separator+e.getName(), e,zipOut); } }else{ try { BufferedInputStream buff=new BufferedInputStream(new FileInputStream(e)); zipOut.putNextEntry(new ZipEntry(name+File.separator+file.getName()+File.separator+e.getName())); byte[] b=new byte[buff.available()]; buff.read(b); buff.close(); zipOut.write(b,0,b.length); } catch (FileNotFoundException e1) { logger.info("文件读取失败"); e1.printStackTrace(); } } } }
原来如此,关键在于 File.separator (系统分隔符), 谢谢解惑