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

时间:2015-02-26 00:00:55

标签: java directory zip zipfile

我在这篇文章中找到了这个ZipUtils类: how to zip a folder itself using 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());
}
}    

1 个答案:

答案 0 :(得分:1)

根据您的需要,您可能有数百种方法可以解决这个问题,但从我的角度来看,您希望能够做的是&#34;将此文件夹压缩到此zip文件&#34;在尽可能少的代码行中......

为此,我可以改变代码以允许你做类似的事情......

ZipUtils appZip = new ZipUtils();
appZip.zipIt(new File(source), new File(output));

使用File不会对参数的含义产生歧义。此机制还意味着您可以根据需要一次又一次地调用zipIt,而无需创建ZipUtils的新实例

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

zipIt

ps-您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); } } } } ,不是有效的&#34;主要入口点&#34;,它应该是public static void main;)

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

的操作
public static void main(String[] args)