在Java中压缩时如何维护文件夹结构?

我想压缩一个像这样结构的文件夹:

温度/文件夹1 / file1的

温度/文件夹2 / file2的

温度/文件3

并完全保持目录结构.
目前,当我拉链时,我得到一个不保持目录结构的zip.看起来像这样
文件1
文件2
文件3

如何将文件添加到各自的文件夹中,就像所有普通的压缩应用程序一样?

这是我到目前为止的代码

package com.damastah.deflash;

import android.util.Log;
import java.io.BufferedInputStream;
import java.io.bufferedoutputstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Compress {
    private static final int BUFFER = 2048;

    private ArrayList<File> _files;
    private String _zipFile;

    public Compress(ArrayList<File> files,String zipFile) {
        _files = files;
        _zipFile = zipFile;
    }

    public void zip() {
        try {
            BufferedInputStream origin = null;
            FileOutputStream dest = new FileOutputStream(_zipFile);

            ZipOutputStream out = new ZipOutputStream(new bufferedoutputstream(
                    dest));

            byte data[] = new byte[BUFFER];
            Log.e("Compress - zip","test");
            for (int i = 0; i < _files.size(); i++) {
                Log.v("Compress","Adding: " + _files.get(i).getAbsolutePath());
                FileInputStream fi = new FileInputStream(_files.get(i)
                        .getAbsolutePath());
                origin = new BufferedInputStream(fi,BUFFER);
                ZipEntry entry;
                if (_files.get(i).getAbsolutePath().contains("."))
                    entry = new ZipEntry(_files
                            .get(i)
                            .getAbsolutePath()
                            .substring(
                                    _files.get(i).getAbsolutePath()
                                            .lastIndexOf("/") + 1));
                else
                    entry = new ZipEntry(_files.get(i).getAbsolutePath());
                out.putNextEntry(entry);

                int count;
                while ((count = origin.read(data,BUFFER)) != -1) {
                    out.write(data,count);
                }

                origin.close();
            }

            out.close();
        } catch (Exception e) {
            e.printstacktrace();
        }

    }
}

解决方法

我不是android开发人员所以请将此代码视为仅提示

class ZipCompress {
    public static void main(String[] args) throws IOException {

        String dir = "d:\\My folder\\";
        // this entries I want to put in archives in the way they are Now
        String[] entries = { "temp\\folder1\\file1.txt","temp\\folder2\\file2.txt","temp\\file3.txt" };

        ZipOutputStream zipos = new ZipOutputStream(new bufferedoutputstream(
                new FileOutputStream(dir + "archive.zip")));

        // time to create entries and fill them with data
        for (String entrie : entries) {
            System.out.println("Writing file: " + dir + entrie);

            // prepering file stream
            BufferedInputStream fileStream = new BufferedInputStream(
                    new FileInputStream(dir + entrie));

//--------------------------------------------------------------------------
//          Here we decide how we entry will look like in archive.
//          We use only part of path from String[] entries
//          like "temp\\folder1\\file1.txt"
//--------------------------------------------------------------------------
            ZipEntry newEntry = new ZipEntry(entrie);

            newEntry.setComment("comment to entry: " + newEntry);

            // Now lets put this entry in archive
            zipos.putNextEntry(newEntry);

            // lets put data from file to current archive entry
            int c;
            while ((c = fileStream.read()) != -1)
                zipos.write(c);
            fileStream.close();
        }
        zipos.close();
    }
}

编辑

我不知道你想在这做什么

if (_files.get(i).getAbsolutePath().contains("."))
                    entry = new ZipEntry(_files
                            .get(i)
                            .getAbsolutePath()
                            .substring(
                                    _files.get(i).getAbsolutePath()
                                            .lastIndexOf("/") + 1));

从我看到它删除文件的路径只留下文件名(类似于_files.get(i).getName()).如果这是真的那么这就是你的zip文件中没有文件夹结构的原因.你说zip条目应该只是那个文件名,没有任何文件夹.

因此,如果您希望zip文件包含路径的某些部分
/ my / full / path / to / folder / temp / folder1 / file1 like temp / folder1 / file1在创建ZipEntry时只删除该路径的不必要部分

String dir = "/my/full/path/to/folder/";
for (int i = 0; i < _files.size(); i++) {
...
    if (_files.get(i).getAbsolutePath().contains(".")) {
        entry = new ZipEntry(_files
            .get(i).getAbsolutePath().replace(dir,""));
...

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...