How to zip and unzip the files?
How to zip and unzip the files which are all already in DDMS : data/data/mypackage/files/
I need a simple example开发者_JAVA百科 for that. I've already search related to zip and unzip. But, no one example available for me. Can anyone tell some example. Advance Thanks.
Take a look at java.util.zip.* classes for zip functionality. I've done some basic zip/unzip code, which I've pasted below. Hope it helps.
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);
}
}
The zip function brianestey provided works well, but the unzip function is very slow due to reading one byte at a time. Here is a modified version of his unzip function that utilizes a buffer and is much faster.
/**
* 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);
}
}
Using File
instead of the file path String
.
This answer is based off of @brianestey's excellent answer.
I have modified his zip
method to accept a list of Files instead of file paths and an output zip File instead of a filepath, which might be helpful to others if that's what they're dealing with.
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();
}
}
This answer is based of brianestey, Ben, Giacomo Mattiuzzi, Joshua Pinter.
Functions rewritten to Kotlin and added functions for working with Uri.
import android.content.Context
import android.net.Uri
import java.io.*
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
private const val MODE_WRITE = "w"
private const val MODE_READ = "r"
fun zip(zipFile: File, files: List<File>) {
ZipOutputStream(BufferedOutputStream(FileOutputStream(zipFile))).use { outStream ->
zip(outStream, files)
}
}
fun zip(context: Context, zipFile: Uri, files: List<File>) {
context.contentResolver.openFileDescriptor(zipFile, MODE_WRITE).use { descriptor ->
descriptor?.fileDescriptor?.let {
ZipOutputStream(BufferedOutputStream(FileOutputStream(it))).use { outStream ->
zip(outStream, files)
}
}
}
}
private fun zip(outStream: ZipOutputStream, files: List<File>) {
files.forEach { file ->
outStream.putNextEntry(ZipEntry(file.name))
BufferedInputStream(FileInputStream(file)).use { inStream ->
inStream.copyTo(outStream)
}
}
}
fun unzip(zipFile: File, location: File) {
ZipInputStream(BufferedInputStream(FileInputStream(zipFile))).use { inStream ->
unzip(inStream, location)
}
}
fun unzip(context: Context, zipFile: Uri, location: File) {
context.contentResolver.openFileDescriptor(zipFile, MODE_READ).use { descriptor ->
descriptor?.fileDescriptor?.let {
ZipInputStream(BufferedInputStream(FileInputStream(it))).use { inStream ->
unzip(inStream, location)
}
}
}
}
private fun unzip(inStream: ZipInputStream, location: File) {
if (location.exists() && !location.isDirectory)
throw IllegalStateException("Location file must be directory or not exist")
if (!location.isDirectory) location.mkdirs()
val locationPath = location.absolutePath.let {
if (!it.endsWith(File.separator)) "$it${File.separator}"
else it
}
var zipEntry: ZipEntry?
var unzipFile: File
var unzipParentDir: File?
while (inStream.nextEntry.also { zipEntry = it } != null) {
unzipFile = File(locationPath + zipEntry!!.name)
if (zipEntry!!.isDirectory) {
if (!unzipFile.isDirectory) unzipFile.mkdirs()
} else {
unzipParentDir = unzipFile.parentFile
if (unzipParentDir != null && !unzipParentDir.isDirectory) {
unzipParentDir.mkdirs()
}
BufferedOutputStream(FileOutputStream(unzipFile)).use { outStream ->
inStream.copyTo(outStream)
}
}
}
}
精彩评论