如何解决从文件列表包括路径文件夹创建 zip
我有一个应用程序,我可以在其中压缩所选文件的列表,即:
- /baseDir/folder_a/file_a.txt
- /baseDir/folder_b/folder_c/file_b.txt(排除)
- /baseDir/folder_b/folder_d/file_c.txt
目前我可以创建一个包含所有文件的 zip 文件。但是,文件夹结构不包括在内,所以我的 zip 看起来像这样:
- /zipFolder/file_a.txt
- /zipFolder/file_c.txt
由于我不想压缩文件夹中的所有文件而只选择一个,所以我很难。有人可以提示我如何添加文件,使其看起来像这样:
- /zipFolder/folder_a/file_a.txt
- /zipFolder/folder_b/folder_d/file_c.txt
这是我的代码:
public static byte[] zip(List<File> listFiles) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
for (File file : listFiles) {
if (file.isDirectory()) {
zipDirectory(file,file.getName(),zipOutputStream);
} else {
zipFile(file,zipOutputStream);
}
}
zipOutputStream.flush();
zipOutputStream.close();
return byteArrayOutputStream.toByteArray();
}
private static void zipDirectory(File folder,String parentFolder,ZipOutputStream zos) throws IOException {
for (File file : folder.listFiles()) {
if (file.getName().endsWith(".zip")) {
continue;
}
if (file.isDirectory()) {
zipDirectory(file,parentFolder + "/" + file.getName(),zos);
continue;
}
zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
long bytesRead = 0;
byte[] bytesIn = new byte[BUFFER_SIZE];
int read = 0;
while ((read = bis.read(bytesIn)) != -1) {
zos.write(bytesIn,read);
bytesRead += read;
}
zos.closeEntry();
bis.close();
}
}
private static void zipFile(File file,ZipOutputStream zos) throws IOException {
zos.putNextEntry(new ZipEntry(file.getName()));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
long bytesRead = 0;
byte[] bytesIn = new byte[BUFFER_SIZE];
int read = 0;
while ((read = bis.read(bytesIn)) != -1) {
zos.write(bytesIn,read);
bytesRead += read;
}
zos.closeEntry();
bis.close();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。