从文件列表创建zip(包括路径文件夹)

wmvff8tz  于 2021-07-23  发布在  Java
关注(0)|答案(0)|浏览(200)

我有一个应用程序,目前可以压缩选定文件的列表,即:
/basedir/文件夹\u a/文件\u a.txt
/basedir/文件夹\u b/文件夹\u c/文件\u b.txt(排除)
/basedir/文件夹\u b/文件夹\u d/文件\u c.txt
现在我可以创建一个包含所有文件的zip文件。但是,不包括文件夹结构,因此我的zip如下所示:
/zipfolder/file_a.txt文件
/zipfolder/file\u c.txt文件
因为我不想压缩一个文件夹中的所有文件,但只选择了一个,我有一个困难的时间。有人能告诉我如何添加文件,使其看起来像这样:
/zipfolder/文件夹\u a/文件\u a.txt
/zipfolder/文件夹\u b/文件夹\u d/文件\u 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, 0, 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, 0, read);
        bytesRead += read;
    }
    zos.closeEntry();
    bis.close();
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题