web-dev-qa-db-ja.com

ファイルを圧縮および解凍する方法は?

すべてがすでにDDMSにあるファイルを圧縮および解凍する方法:data/data/mypackage/files/そのための簡単な例が必要です。すでにZipとunzipに関連する検索を行っています。しかし、私に利用できる例はありません。誰でもいくつか例を挙げることができます。事前に感謝します。

33
user905216

Zip機能のJava.util.Zip。*クラスをご覧ください。以下に貼り付けた基本的なZip/unzipコードをいくつか作成しました。それが役に立てば幸い。

public static void Zip(String[] files, String zipFile) throws IOException {
    BufferedInputStream Origin = null;
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
    try { 
        byte data[] = new byte[BUFFER_SIZE];

        for (int i = 0; i < files.length; i++) {
            FileInputStream fi = new FileInputStream(files[i]);    
            Origin = new BufferedInputStream(fi, BUFFER_SIZE);
            try {
                ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1));
                out.putNextEntry(entry);
                int count;
                while ((count = Origin.read(data, 0, BUFFER_SIZE)) != -1) {
                    out.write(data, 0, count);
                }
            }
            finally {
                Origin.close();
            }
        }
    }
    finally {
        out.close();
    }
}

public static void unzip(String zipFile, String location) throws IOException {
    try {
        File f = new File(location);
        if(!f.isDirectory()) {
            f.mkdirs();
        }
        ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile));
        try {
            ZipEntry ze = null;
            while ((ze = zin.getNextEntry()) != null) {
                String path = location + ze.getName();

                if (ze.isDirectory()) {
                    File unzipFile = new File(path);
                    if(!unzipFile.isDirectory()) {
                        unzipFile.mkdirs();
                    }
                }
                else {
                    FileOutputStream fout = new FileOutputStream(path, false);
                    try {
                        for (int c = zin.read(); c != -1; c = zin.read()) {
                            fout.write(c);
                        }
                        zin.closeEntry();
                    }
                    finally {
                        fout.close();
                    }
                }
            }
        }
        finally {
            zin.close();
        }
    }
    catch (Exception e) {
        Log.e(TAG, "Unzip exception", e);
    }
}
61
brianestey

提供されているZip関数brianesteyは正常に機能しますが、unzip関数は一度に1バイトずつ読み込むため、非常に遅くなります。バッファーを使用し、はるかに高速なunzip機能の修正版を以下に示します。

/**
 * Unzip a Zip file.  Will overwrite existing files.
 * 
 * @param zipFile Full path of the Zip file you'd like to unzip.
 * @param location Full path of the directory you'd like to unzip to (will be created if it doesn't exist).
 * @throws IOException
 */
public static void unzip(String zipFile, String location) throws IOException {
    int size;
    byte[] buffer = new byte[BUFFER_SIZE];

    try {
        if ( !location.endsWith(File.separator) ) {
            location += File.separator;
        }
        File f = new File(location);
        if(!f.isDirectory()) {
            f.mkdirs();
        }
        ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile), BUFFER_SIZE));
        try {
            ZipEntry ze = null;
            while ((ze = zin.getNextEntry()) != null) {
                String path = location + ze.getName();
                File unzipFile = new File(path);

                if (ze.isDirectory()) {
                    if(!unzipFile.isDirectory()) {
                        unzipFile.mkdirs();
                    }
                } else {
                    // check for and create parent directories if they don't exist
                    File parentDir = unzipFile.getParentFile();
                    if ( null != parentDir ) {
                        if ( !parentDir.isDirectory() ) {
                            parentDir.mkdirs();
                        }
                    }

                    // unzip the file
                    FileOutputStream out = new FileOutputStream(unzipFile, false);
                    BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE);
                    try {
                        while ( (size = zin.read(buffer, 0, BUFFER_SIZE)) != -1 ) {
                            fout.write(buffer, 0, size);
                        }

                        zin.closeEntry();
                    }
                    finally {
                        fout.flush();
                        fout.close();
                    }
                }
            }
        }
        finally {
            zin.close();
        }
    }
    catch (Exception e) {
        Log.e(TAG, "Unzip exception", e);
    }
}
47
Ben

ファイルパスFileの代わりにStringを使用します。

この回答は、 @ brianesteyの優れた回答 に基づいています。

私は彼のZipメソッドを修正して、ファイルパスの代わりにファイルのリストを受け入れ、ファイルパスの代わりに出力Zipファイルを受け入れます。

public static void Zip( List<File> files, File zipFile ) throws IOException {
    final int BUFFER_SIZE = 2048;

    BufferedInputStream Origin = null;
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));

    try {
        byte data[] = new byte[BUFFER_SIZE];

        for ( File file : files ) {
            FileInputStream fileInputStream = new FileInputStream( file );

            Origin = new BufferedInputStream(fileInputStream, BUFFER_SIZE);

            String filePath = file.getAbsolutePath();

            try {
                ZipEntry entry = new ZipEntry( filePath.substring( filePath.lastIndexOf("/") + 1 ) );

                out.putNextEntry(entry);

                int count;
                while ((count = Origin.read(data, 0, BUFFER_SIZE)) != -1) {
                    out.write(data, 0, count);
                }
            }
            finally {
                Origin.close();
            }
        }
    }
    finally {
        out.close();
    }
}
5
Joshua Pinter