我在这篇文章中找到了这个ZipUtils类: 如何使用java压缩文件夹本身
我对其进行了修改,以便可以传递一个zip文件名。但是,它的唯一工作方式是使用硬编码的静态字符串。从数据库中获取zippedFile字符串。我已经将dbZippedFile和hardcodedZippedFile进行了比较,它们都是相同的……也许在FileOutputStream中使用非静态字符串会产生问题吗?仅在尝试压缩目录时会发生此问题(一个文件可以正常工作)。有谁知道我在做什么错或有很好的选择?
它永远不会引发错误。它只是无法创建文件。在代码段中,如果将zippedFile.getPath()替换为硬编码的字符串表示形式(即“ D:\\ dir \\ file.zip”),则可以正常工作。
码:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); Date date = new Date(); String zipName = name+ "_" + dateFormat.format(date) + ".zip"; zippedFile = new File(archive, zipName); if (zippedFile .exists()) { zippedFile .delete(); } ZipUtils.main(dirToZip.getPath(), zippedFile.getPath());
类:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipUtils { private List<String> fileList; private static String SOURCE_FOLDER; // SourceFolder path public ZipUtils() { fileList = new ArrayList<String>(); } public static void main(String source, String output) { SOURCE_FOLDER = source; //output = "D:\\dir\\file.zip"; ZipUtils appZip = new ZipUtils(); appZip.generateFileList(new File(SOURCE_FOLDER)); appZip.zipIt(output); } public void zipIt(String zipFile) { byte[] buffer = new byte[1024]; String source = ""; FileOutputStream fos = null; ZipOutputStream zos = null; try { try { source = SOURCE_FOLDER.substring(SOURCE_FOLDER.lastIndexOf("\\") + 1, SOURCE_FOLDER.length()); } catch (Exception e) { source = SOURCE_FOLDER; } fos = new FileOutputStream(zipFile); zos = new ZipOutputStream(fos); System.out.println("Output to Zip : " + zipFile); FileInputStream in = null; for (String file : this.fileList) { System.out.println("File Added : " + file); ZipEntry ze = new ZipEntry(source + File.separator + file); zos.putNextEntry(ze); try { in = new FileInputStream(SOURCE_FOLDER + File.separator + file); int len; while ((len = in.read(buffer)) > 0) { zos.write(buffer, 0, len); } } finally { in.close(); } } zos.closeEntry(); System.out.println("Folder successfully compressed"); } catch (IOException ex) { ex.printStackTrace(); } finally { try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } } public void generateFileList(File node) { // add file only if (node.isFile()) { fileList.add(generateZipEntry(node.toString())); } if (node.isDirectory()) { String[] subNote = node.list(); for (String filename : subNote) { generateFileList(new File(node, filename)); } } } private String generateZipEntry(String file) { return file.substring(SOURCE_FOLDER.length() + 1, file.length()); } }
根据您的需要,可能有数百种方法可以解决此问题,但是从我的角度来看,您想要做的就是用尽可能少的代码说“将此文件夹压缩到这个zip文件” …
为此,我可以更改代码以允许您执行类似…
ZipUtils appZip = new ZipUtils(); appZip.zipIt(new File(source), new File(output));
对于File参数的含义,使用树叶没有任何歧义。这种机制还意味着您可以zipIt根据需要一次又一次地调用,而不必创建一个新的ZipUtils
File
zipIt
ZipUtils
这将需要对基本代码进行一些修改,因为它假定String了文件路径的值,坦率地说,这令人发狂,因为您真正想要的所有信息都可以从File对象- IMHO中轻松获得。这也意味着,除了zipIt方法的范围之外,您根本不需要维护对源路径的引用。
String
public static class ZipUtils { private final List<File> fileList; private List<String> paths; public ZipUtils() { fileList = new ArrayList<>(); paths = new ArrayList<>(25); } public void zipIt(File sourceFile, File zipFile) { if (sourceFile.isDirectory()) { byte[] buffer = new byte[1024]; FileOutputStream fos = null; ZipOutputStream zos = null; try { String sourcePath = sourceFile.getPath(); generateFileList(sourceFile); fos = new FileOutputStream(zipFile); zos = new ZipOutputStream(fos); System.out.println("Output to Zip : " + zipFile); FileInputStream in = null; for (File file : this.fileList) { String path = file.getParent().trim(); path = path.substring(sourcePath.length()); if (path.startsWith(File.separator)) { path = path.substring(1); } if (path.length() > 0) { if (!paths.contains(path)) { paths.add(path); ZipEntry ze = new ZipEntry(path + "/"); zos.putNextEntry(ze); zos.closeEntry(); } path += "/"; } String entryName = path + file.getName(); System.out.println("File Added : " + entryName); ZipEntry ze = new ZipEntry(entryName); zos.putNextEntry(ze); try { in = new FileInputStream(file); int len; while ((len = in.read(buffer)) > 0) { zos.write(buffer, 0, len); } } finally { in.close(); } } zos.closeEntry(); System.out.println("Folder successfully compressed"); } catch (IOException ex) { ex.printStackTrace(); } finally { try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } } } protected void generateFileList(File node) { // add file only if (node.isFile()) { fileList.add(node); } if (node.isDirectory()) { File[] subNote = node.listFiles(); for (File filename : subNote) { generateFileList(filename); } } } }
ps-您public static void main不是有效的“主入口点”,应该是public static void main(String[] args);)
public static void main
public static void main(String[] args)
因此,根据您的代码段,您可以简单地执行以下操作:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); Date date = new Date(); String zipName = name+ "_" + dateFormat.format(date) + ".zip"; zippedFile = new File(archive, zipName); if (zippedFile exists()) { zippedFile.delete(); } ZipUtils zu = new ZipUtils(); zu.zipIt(dirToZip, zippedFile);