下面是我试过的代码。它仅压缩子文件夹的内容而不压缩文件夹 我需要将所有子文件夹连同内容一起压缩。我在这里做错了什么。 示例:我在 demo 文件夹中有一个文件夹“demo”,我有 a、b、c 文件夹。我想压缩 a、b、c 和内容,zip 不应包含演示的父级。
static void addDir(File dirObj, ZipOutputStream out) throws IOException {
File[] files = dirObj.listFiles();
byte[] tmpBuf = new byte[1024];
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
addDir(files[i], out);
continue;
}
FileInputStream in = new FileInputStream(files[i].getAbsolutePath());
System.out.println(" Adding: " + files[i].getName());
out.putNextEntry(new ZipEntry(files[i].getName()));
int len;
while ((len = in.read(tmpBuf)) > 0) {
out.write(tmpBuf, 0, len);
}
out.closeEntry();
in.close();
}
}
public static void zipFiles(File[] subd) {
String zipFile = "test.zip";
try {
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
for (File dir : subd) {
addDir(dir, zos);
}
// close the ZipOutputStream
zos.close();
} catch (IOException ioe) {
System.out.println("Error creating zip file: " + ioe);
}
最佳答案
这是我为 zip 文件和有层次结构和没有层次结构的目录所做的代码。
zip.getHierarchy().equals("F")
部分完成您想要完成的工作。
在此代码中,您必须将源文件、目标、层次结构 (T/F) 作为参数传递。
此外,您可能需要一个 DTO 类。
public static void Start() throws IOException{
FileOutputStream fos = new FileOutputStream(zip.getDestination());
ZipOutputStream zipOut = new ZipOutputStream(fos);
File fileToZip = new File(zip.getSourcePath());
zipDirectory(fileToZip, fileToZip.getName(), zipOut);
zipOut.close();
fos.close();
}
public static void zipDirectory(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
if (fileToZip.isDirectory()) {
File[] children = fileToZip.listFiles();
for (File childFile : children) {
if(zip.getHierarchy().equals("T")) {
zipDirectory(childFile, childFile.getPath(), zipOut);
}else if(zip.getHierarchy().equals("F")){
zipDirectory(childFile, childFile.getName(), zipOut);
}
}
return;
}
doZip(fileToZip,fileName,zipOut);
}
public static void doZip(File fileToZip,String fileName,ZipOutputStream zipOut) throws IOException {
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileName);
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
fis.close();
}
关于java - 压缩子目录仅压缩子目录的内容而不压缩子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56981140/