Java:具有非静态文件名的Zip文件

我在这篇文章中找到了这个ZipUtils类: 如何使用java压缩文件夹本身

我修改了它,所以我可以传递一个zip文件名。 但是,它的唯一工作方式是使用硬编码的静态字符串。 zippedFile字符串是从数据库中获取的。 我已经比较了dbZippedFile和hardcodedZippedFile,它们都是相同的…也许在使用FileOutputStream的非静态字符串时会出现问题? 尝试压缩目录时只会出现此问题(一个文件正常工作)。 有谁知道我做错了什么或有一个好的选择?

它永远不会抛出错误。 它只是无法创建文件。 在代码片段中,如果将zippedFile.getPath()替换为硬编码字符串表示forms(即“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 fileList; private static String SOURCE_FOLDER; // SourceFolder path public ZipUtils() { fileList = new ArrayList(); } 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的新实例

这将需要对基本代码进行一些修改,因为它假定文件路径的String值,坦率地说这是令人抓狂的,因为您真正想要的所有信息都可以更容易地从File对象获得 – 恕我直言。 这也意味着您根本不需要维护对源路径的引用,超出了zipIt方法的范围

 public static class ZipUtils { private final List fileList; private List 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) ;)

因此,根据您的代码段,您可以简单地执行类似…

 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);