Bienvenido a Universo Android

Estamos actualizando el sitio web! Pronto subiremos el nuevo diseño de la web! Gracias por su paciencia!

Mostrando entradas con la etiqueta leer zip android. Mostrar todas las entradas
Mostrando entradas con la etiqueta leer zip android. Mostrar todas las entradas

🚀 Cómo crear y extraer archivos ZIP (Zip / UnZip) en Android usando Java y Android Studio

En este tutorial aprenderás paso a paso cómo comprimir y descomprimir archivos ZIP en Android utilizando Java.
Este ejemplo es ideal para quienes están iniciando en la gestión de archivos en Android, y desean comprender cómo manipular carpetas, crear archivos y trabajar con compresión ZIP.


📘 Contenido del Tutorial

  1. Crear un proyecto en Android Studio

  2. Diseño de la aplicación

  3. Clase ArchivoHelper para crear ZIP y extraer ZIP

  4. Código de MainActivity

  5. Permisos necesarios

  6. Probar la aplicación en un emulador AVD

  7. Preguntas frecuentes (FAQ)


🛠️ Crear un nuevo proyecto en Android Studio

  1. Abre Android Studio

  2. Selecciona New Project → Empty Activity

  3. Usa Java como lenguaje de programación

  4. Asigna un nombre a tu proyecto, por ejemplo:
    ZipUnzipAndroid

Con esto ya tendremos la base para trabajar.


🎨 Diseño de la aplicación (Layout XML)

Este diseño será sencillo: dos botones (Zip y Unzip) y un CheckBox para decidir si incluir la carpeta raíz dentro del ZIP.

Copia este código en res/layout/activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout android:padding="10dp" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/buttons" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnZip" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Zip"/> <Button android:id="@+id/btnUnzip" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Unzip"/> </LinearLayout> <CheckBox android:id="@+id/chkParent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Incluir carpeta principal en ZIP" android:layout_below="@+id/buttons" android:layout_marginTop="20dp"/> </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout>

📦 Código para crear y extraer ZIP en Android

Toda la lógica será manejada por una clase llamada ArchivoHelper, que se encargará de:

✔ Comprimir carpetas o archivos
✔ Extraer archivos ZIP
✔ Crear archivos de texto dummy
✔ Manejar rutas y excepciones

Crea un archivo llamado ArchivoHelper.java y pega lo siguiente:

import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ArchivoHelper { private static final int BUFFER_SIZE = 8192; private static String TAG = ArchivoHelper.class.getName(); private static String parentPath = ""; public static boolean zip(String sourcePath, String destinationPath, String destinationFileName, Boolean includeParentFolder) { new File(destinationPath).mkdirs(); ZipOutputStream zipOutputStream = null; try { if (!destinationPath.endsWith("/")) destinationPath += "/"; String destination = destinationPath + destinationFileName; File file = new File(destination); if (!file.exists()) file.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream(file); zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream)); parentPath = includeParentFolder ? new File(sourcePath).getParent() + "/" : sourcePath; zipFile(zipOutputStream, sourcePath); } catch (IOException ioe) { Log.d(TAG, ioe.getMessage()); return false; } finally { try { if (zipOutputStream != null) zipOutputStream.close(); } catch (IOException ignore) {} } return true; } private static void zipFile(ZipOutputStream zipOutputStream, String sourcePath) throws IOException { File files = new File(sourcePath); File[] fileList = files.listFiles(); for (File file : fileList) { if (file.isDirectory()) { zipFile(zipOutputStream, file.getPath()); } else { byte[] data = new byte[BUFFER_SIZE]; BufferedInputStream input = new BufferedInputStream(new FileInputStream(file.getPath()), BUFFER_SIZE); String entryPath = file.getAbsolutePath().replace(parentPath, ""); ZipEntry entry = new ZipEntry(entryPath); zipOutputStream.putNextEntry(entry); int count; while ((count = input.read(data)) != -1) zipOutputStream.write(data, 0, count); input.close(); } } } public static Boolean unzip(String sourceFile, String destinationFolder) { ZipInputStream zis = null; try { zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(sourceFile))); ZipEntry ze; byte[] buffer = new byte[BUFFER_SIZE]; while ((ze = zis.getNextEntry()) != null) { String fileName = ze.getName(); fileName = fileName.substring(fileName.indexOf("/") + 1); File file = new File(destinationFolder, fileName); File dir = ze.isDirectory() ? file : file.getParentFile(); if (!dir.isDirectory()) dir.mkdirs(); if (ze.isDirectory()) continue; FileOutputStream fout = new FileOutputStream(file); int count; while ((count = zis.read(buffer)) != -1) fout.write(buffer, 0, count); fout.close(); } } catch (IOException ioe) { Log.d(TAG, ioe.getMessage()); return false; } finally { try { if (zis != null) zis.close(); } catch (IOException ignore) {} } return true; } public static void saveToFile(String destinationPath, String data, String fileName) { try { new File(destinationPath).mkdirs(); File file = new File(destinationPath + fileName); if (!file.exists()) file.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream(file, true); fileOutputStream.write((data + System.lineSeparator()).getBytes()); } catch (IOException ex) { Log.d(TAG, ex.getMessage()); } } }

🎛️ Clase MainActivity

Aquí conectamos los botones del layout con las funciones ZIP/UNZIP.

Copia este código en MainActivity.java:

import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Environment; import android.widget.Button; import android.widget.CheckBox; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private String SDPath = Environment.getExternalStorageDirectory().getAbsolutePath(); private String dataPath = SDPath + "/instinctcoder/zipunzip/data/"; private String zipPath = SDPath + "/instinctcoder/zipunzip/zip/"; private String unzipPath = SDPath + "/instinctcoder/zipunzip/unzip/"; Button btnUnzip, btnZip; CheckBox chkParent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnUnzip = findViewById(R.id.btnUnzip); btnZip = findViewById(R.id.btnZip); chkParent = findViewById(R.id.chkParent); btnUnzip.setOnClickListener(v -> { if (ArchivoHelper.unzip(zipPath + "dummy.zip", unzipPath)) { Toast.makeText(MainActivity.this, "Unzip realizado con éxito.", Toast.LENGTH_LONG).show(); } }); btnZip.setOnClickListener(v -> { if (ArchivoHelper.zip(dataPath, zipPath, "dummy.zip", chkParent.isChecked())) { Toast.makeText(MainActivity.this, "Zip creado con éxito.", Toast.LENGTH_LONG).show(); } }); // Crear archivos de prueba (dummy) ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 01", "Dummy1.txt"); ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 02", "Dummy2.txt"); ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 03", "Dummy3.txt"); } }

🔐 Permisos necesarios

Agrega este permiso en tu archivo AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

En Android 10+ deberás pedir el permiso en tiempo de ejecución (Runtime Permission).


📱 Probar la aplicación en un emulador AVD

  1. Crea un emulador AVD desde Android Studio

  2. Ejecuta tu proyecto

  3. Prueba comprimir archivos y extraerlos dentro del emulador


🧪 Resultado Final

✔ Tendrás un ZIP creado desde tus propios archivos
✔ Podrás extraerlo en la ubicación que definas
✔ Aprenderás a manejar directorios, archivos y flujos de entrada/salida
✔ Ideal para aprender gestión de archivos avanzada en Android


❓ Preguntas frecuentes (FAQ)

1. ¿Necesito permisos especiales para crear ZIP o extraer ZIP?

Sí, necesitas el permiso WRITE_EXTERNAL_STORAGE para trabajar con almacenamiento externo.

2. ¿Puedo trabajar solo con almacenamiento interno?

Sí. Puedes usar getFilesDir() y no necesitarás permisos.

3. ¿Se puede modificar para comprimir solo archivos específicos?

Sí, solo debes procesar los archivos que desees antes de pasarlos al método zip().

4. ¿Android permite descomprimir ZIP con subcarpetas?

Sí, el código soporta subcarpetas sin problema.