web-dev-qa-db-fra.com

Comment compresser et décompresser les fichiers?

Comment compresser et décompresser les fichiers qui sont tous déjà dans DDMS: data/data/mypackage/files/ J'ai besoin d'un exemple simple pour cela. J'ai déjà effectué des recherches sur Zip et décompressez. Mais, aucun exemple disponible pour moi. Quelqu'un peut-il donner un exemple? Merci d'avance.

33
user905216

Jetez un œil aux classes Java.util.Zip. * Pour la fonctionnalité Zip. J'ai fait un code de base Zip/décompresser, que j'ai collé ci-dessous. J'espère que cela aide.

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

La fonction Zip fournie par brianestey fonctionne bien, mais la fonction de décompression est très lente en raison de la lecture d'un octet à la fois. Voici une version modifiée de sa fonction de décompression qui utilise un tampon et est beaucoup plus rapide.

/**
 * 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

Utilisation de File au lieu du chemin du fichier String.

Cette réponse est basée sur @ l'excellente réponse de @ brianestey .

J'ai modifié sa méthode Zip pour accepter une liste de fichiers au lieu de chemins de fichier et un fichier Zip de sortie au lieu d'un chemin de fichier, ce qui pourrait être utile aux autres si c'est ce qu'ils traitent.

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