Arbeiten mit ZIP/Archiven in Kotlin: vollständige Anleitung
In der modernen Entwicklung mit Kotlin (insbesondere für JVM und Android) besteht häufig die Notwendigkeit, mit ZIP-Archiven zu arbeiten: Logs packen, Ressourcen entpacken, Backups erstellen oder Daten komprimiert zu übertragen. In diesem Artikel werden wir ausführlich erläutern, wie man mit ZIP-Archiven in Kotlin arbeitet, indem man die integrierten Java-Funktionen (Paket java.util.zip) nutzt, sowie praktische Erweiterungen und Alternativen betrachten.
Warum ist die Arbeit mit Archiven in Kotlin wichtig?
- Platzersparnis — Datenkomprimierung bei der Speicherung auf der Festplatte.
- Bequeme Übertragung — ein Archiv anstelle vieler Dateien.
- Sicherheit — Möglichkeit der Verschlüsselung (mit zusätzlichen Bibliotheken).
- Arbeit mit Ressourcen — Entpacken von Konfigurationen oder Updates.
Wichtige Java-Klassen für die Arbeit mit ZIP
Kotlin ist vollständig kompatibel mit Java, daher verwenden wir für die Arbeit mit Archiven die folgenden Klassen aus java.util.zip:
ZipOutputStream— zum Erstellen eines Archivs.ZipInputStream— zum Lesen eines Archivs.ZipEntry— repräsentiert eine einzelne Datei/einen Ordner innerhalb des Archivs.ZipFile— praktische Klasse zum Lesen eines vorhandenen Archivs.
Beispiel 1: Erstellen eines ZIP-Archivs in Kotlin
Wir erstellen ein Archiv, das mehrere Dateien und Ordner enthält. Wir verwenden ZipOutputStream und BufferedOutputStream zur Leistungssteigerung.
import java.io.*import java.util.zip.*
fun createZipArchive( filesToZip: List<File>, outputZipPath: String) { ZipOutputStream(BufferedOutputStream(FileOutputStream(outputZipPath))).use { zos -> for (file in filesToZip) { if (file.isDirectory) { // Leeren Ordner hinzufügen zos.putNextEntry(ZipEntry("${file.name}/")) zos.closeEntry() continue } // Datei hinzufügen val entry = ZipEntry(file.name) zos.putNextEntry(entry) FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } println("Archiv erstellt: $outputZipPath")}
fun main() { val files = listOf( File("document.txt"), File("image.png"), File("configs") // Ordner ) createZipArchive(files, "output.zip")}Beispiel 2: Lesen des Inhalts eines ZIP-Archivs
Zum Anzeigen der Dateiliste innerhalb des Archivs ist die Verwendung von ZipFile praktisch.
import java.util.zip.ZipFile
fun listZipContents(zipPath: String) { ZipFile(zipPath).use { zip -> println("Inhalt des Archivs $zipPath:") zip.entries().asSequence().forEach { entry -> val size = if (entry.isDirectory) "Ordner" else "${entry.size} Bytes" println("- ${entry.name} ($size)") } }}
fun main() { listZipContents("output.zip")}Beispiel 3: Entpacken eines ZIP-Archivs
Wir extrahieren alle Dateien aus dem Archiv in einen angegebenen Ordner. Beachten Sie die Behandlung von verschachtelten Ordnern.
import java.io.*import java.util.zip.ZipInputStream
fun extractZip( zipPath: String, outputDir: String = "extracted") { val destDir = File(outputDir) destDir.mkdirs()
ZipInputStream(BufferedInputStream(FileInputStream(zipPath))).use { zis -> var entry = zis.nextEntry while (entry != null) { val file = File(destDir, entry.name) if (entry.isDirectory) { file.mkdirs() } else { // Übergeordnete Ordner erstellen file.parentFile?.mkdirs() BufferedOutputStream(Fi Auch in der Bibliothek
Maschinelles Lernen mit C++: Überblick über die wichtigsten Bibliotheken
Detekt für Kotlin: Vollständiges Tutorial mit Beispielen
Symfony/Console für PHP: Komplette Anleitung mit Beispielen
Aufgabenwarteschlangen in Node.js: Bull, Bee-Queue, Kue und Implementierung auf Redis
Arbeiten mit ZIP-Archiven in Rust: Die Bibliothek zip und eine vollständige Anleitung