我正在尝试将一些文件添加到ZIP文件中,它会创建文件,但不会向其中添加任何内容。 代码1:
String fulldate = year + "-" + month + "-" + day + "-" + min;
File dateFolder = new File("F:\\" + compname + "\\" + fulldate);
dateFolder.mkdir();
String zipName = "F:\\" + compname + "\\" + fulldate + "\\" + fulldate + ".zip";
zipFolder(tobackup, zipName);
我的功能:
public static void zipFolder(File folder, String name) throws Exception {
byte[] buffer = new byte[18024];
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(name));
FileInputStream in = new FileInputStream(folder);
out.putNextEntry(new ZipEntry(name));
int len;
while((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.closeEntry();
in.close();
out.close();
}
编辑:我发现了问题,只是在将文件从C:\驱动器写入F:\驱动器中的ZIP时遇到问题
答案 0 :(得分:14)
你不能压缩文件夹,只能压缩文件。要压缩文件夹,您必须手动添加所有子文件。我写了这个完成这项工作的课程。你可以免费获得它:)
用法如下:
List<File> sources = new ArrayList<File>();
sources.add(tobackup);
Packager.packZip(new File(zipName), sources);
这是班级:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Packager
{
public static void packZip(File output, List<File> sources) throws IOException
{
System.out.println("Packaging to " + output.getName());
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(output));
zipOut.setLevel(Deflater.DEFAULT_COMPRESSION);
for (File source : sources)
{
if (source.isDirectory())
{
zipDir(zipOut, "", source);
} else
{
zipFile(zipOut, "", source);
}
}
zipOut.flush();
zipOut.close();
System.out.println("Done");
}
private static String buildPath(String path, String file)
{
if (path == null || path.isEmpty())
{
return file;
} else
{
return path + "/" + file;
}
}
private static void zipDir(ZipOutputStream zos, String path, File dir) throws IOException
{
if (!dir.canRead())
{
System.out.println("Cannot read " + dir.getCanonicalPath() + " (maybe because of permissions)");
return;
}
File[] files = dir.listFiles();
path = buildPath(path, dir.getName());
System.out.println("Adding Directory " + path);
for (File source : files)
{
if (source.isDirectory())
{
zipDir(zos, path, source);
} else
{
zipFile(zos, path, source);
}
}
System.out.println("Leaving Directory " + path);
}
private static void zipFile(ZipOutputStream zos, String path, File file) throws IOException
{
if (!file.canRead())
{
System.out.println("Cannot read " + file.getCanonicalPath() + " (maybe because of permissions)");
return;
}
System.out.println("Compressing " + file.getName());
zos.putNextEntry(new ZipEntry(buildPath(path, file.getName())));
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[4092];
int byteCount = 0;
while ((byteCount = fis.read(buffer)) != -1)
{
zos.write(buffer, 0, byteCount);
System.out.print('.');
System.out.flush();
}
System.out.println();
fis.close();
zos.closeEntry();
}
}
享受!
编辑:要检查程序是否仍然忙,您可以添加我用(*)
标记的三行编辑2 :尝试使用新代码。在我的平台上,它运行正常(OS X)。我不确定但是,AppData中的Windows文件可能存在一些有限的读取权限。
答案 1 :(得分:2)
另见ZeroTurnaround's Zip library。它具有(引用)等功能:
答案 2 :(得分:0)
我将使用 Java 7 NIO FileSystem 添加另一种方法。它使用 JAR 文件实际上是 ZIP 的事实:
static public void addToZip(Path zip, Path file) throws IOException {
Map<String,String> env = new HashMap<>();
env.put("create", "false"); // We don't create the file but modify it
URI uri = URI.create("jar:file:"+zip.toString());
try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
Path f = zipfs.getPath(file.getFileName().toString());
Files.copy(file, f, StandardCopyOption.REPLACE_EXISTING);
}
}