【发布时间】:2015-04-28 05:16:50
【问题描述】:
我在这篇文章中找到了这个 ZipUtils 类: how to zip a folder itself using java
我对其进行了修改,以便可以传递一个 zip 文件名。但是,它的唯一工作方式是使用硬编码的静态字符串。 zippedFile 字符串是从数据库中获取的。我已经比较了 dbZippedFile 和 hardcodedZippedFile 并且它们都是相同的......也许在 FileOutputStream 中使用非静态字符串存在问题?仅在尝试压缩目录时才会出现此问题(一个文件可以正常工作)。有谁知道我做错了什么或有一个好的选择?
它永远不会抛出错误。它只是无法创建文件。 在代码 sn-p 中,如果将 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());
}
}
【问题讨论】:
-
嗯,这听起来是个奇怪的问题。 Java 中对字符串的修改并没有真正发生(所有字符串操作都返回一个新字符串),所以我看不出这会有什么不同。您能否发布导致错误的代码以及错误是什么?
-
显示不起作用的示例,以及您的预期。
-
以某种方式将源文件引用传递给
ZipUtils类 -
我添加了一个代码sn-p和进一步的解释。
-
在您更新的问题中,您似乎将要压缩的源目录与输出 zipfile 混淆了
标签: java directory zip zipfile