java.util.zip - Recreating directory structure(转)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java.util.zip - Recreating directory structure(转),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4654字,纯文字阅读大概需要7分钟。
内容图文
![java.util.zip - Recreating directory structure(转)](/upload/InfoBanner/zyjiaocheng/1224/efc960f4268d4afcaf0940a576ed2f85.jpg)
include my own version for your reference.
We use this one to zip up photos to download so it works with various unzip programs. It preserves the directory structure and timestamps.
public static void createZipFile(File srcDir, OutputStream out, boolean verbose) throws IOException { List<String> fileList = listDirectory(srcDir); ZipOutputStream zout = new ZipOutputStream(out); zout.setLevel(9); zout.setComment("Zipper v1.2"); for (String fileName : fileList) { File file = new File(srcDir.getParent(), fileName); if (verbose) System.out.println(" adding: " + fileName); // Zip always use / as separator String zipName = fileName; if (File.separatorChar != ‘/‘) zipName = fileName.replace(File.separatorChar, ‘/‘); ZipEntry ze; if (file.isFile()) { ze = new ZipEntry(zipName); ze.setTime(file.lastModified()); zout.putNextEntry(ze); FileInputStream fin = new FileInputStream(file); byte[] buffer = newbyte[4096]; for (int n; (n = fin.read(buffer)) > 0;) zout.write(buffer, 0, n); fin.close(); } else { ze = new ZipEntry(zipName + ‘/‘); ze.setTime(file.lastModified()); zout.putNextEntry(ze); } } zout.close(); } publicstatic List<String> listDirectory(File directory) throws IOException { Stack<String> stack = new Stack<String>(); List<String> list = new ArrayList<String>(); // If it‘s a file, just return itselfif (directory.isFile()) { if (directory.canRead()) list.add(directory.getName()); return list; } // Traverse the directory in width-first manner, no-recursively String root = directory.getParent(); stack.push(directory.getName()); while (!stack.empty()) { String current = (String) stack.pop(); File curDir = new File(root, current); String[] fileList = curDir.list(); if (fileList != null) { for (String entry : fileList) { File f = new File(curDir, entry); if (f.isFile()) { if (f.canRead()) { list.add(current + File.separator + entry); } else { System.err.println("File " + f.getPath() + " is unreadable"); thrownew IOException("Can‘t read file: " + f.getPath()); } } elseif (f.isDirectory()) { list.add(current + File.separator + entry); stack.push(current + File.separator + f.getName()); } else { thrownew IOException("Unknown entry: " + f.getPath()); } } } } return list; } }
SEPARATOR constant is initialised with the System.getProperty("file.separator") which will give me the OS default file separator.
I would never hardcode a separator since that assumes that your code will only be deployed on a given OS
Don‘t use File.separator in ZIP. The separator must be "/" according to the spec. If you are on Windows, you must open file as "D:\dir\subdir\file" but ZIP entry must be "dir/subdir/file"
Just go through the source of java.util.zip.ZipEntry. It treats a ZipEntry as directory if its name ends with "/" characters. Just suffix the directory name with "/". Also you need to remove the drive prefix to make it relative.
Here is another example (recursive) which also lets you include/exclude the containing folder form the zip:
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.ZipOutputStream; public class ZipUtil { private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; publicstaticvoid main(String[] args) throws Exception { zipFile("C:/tmp/demo", "C:/tmp/demo.zip", true); } publicstaticvoid zipFile(String fileToZip, String zipFile, boolean excludeContainingFolder) throws IOException { ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); File srcFile = new File(fileToZip); if(excludeContainingFolder && srcFile.isDirectory()) { for(String fileName : srcFile.list()) { addToZip("", fileToZip + "/" + fileName, zipOut); } } else { addToZip("", fileToZip, zipOut); } zipOut.flush(); zipOut.close(); System.out.println("Successfully created " + zipFile); } privatestaticvoid addToZip(String path, String srcFile, ZipOutputStream zipOut) throws IOException { File file = new File(srcFile); String filePath = "".equals(path) ? file.getName() : path + "/" + file.getName(); if (file.isDirectory()) { for (String fileName : file.list()) { addToZip(filePath, srcFile + "/" + fileName, zipOut); } } else { zipOut.putNextEntry(new ZipEntry(filePath)); FileInputStream in = new FileInputStream(srcFile); byte[] buffer = newbyte[DEFAULT_BUFFER_SIZE]; int len; while ((len = in.read(buffer)) != -1) { zipOut.write(buffer, 0, len); } in.close(); } } }
http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structure
原文:http://www.cnblogs.com/softidea/p/4273093.html
内容总结
以上是互联网集市为您收集整理的java.util.zip - Recreating directory structure(转)全部内容,希望文章能够帮你解决java.util.zip - Recreating directory structure(转)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。