Bagaimana cara unzip file secara terprogram di Android?
131
Saya memerlukan potongan kode kecil yang membuka ritsleting beberapa file dari file .zip yang diberikan dan memberikan file yang terpisah sesuai dengan format mereka di file zip. Silakan kirim pengetahuan Anda dan bantu saya.
<menggunakan-izin android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Lou Morda
1
Saya pikir ya, itu berhasil, karena itu adalah cara yang biasa untuk membongkar barang. Cukup kelola untuk mendapatkan 'path' dan 'zipname' yang benar. Saya juga melihat beberapa hal yang mungkin menarik bagi Anda (yakin Anda sudah melihatnya): tautan
Vasily Sochinsky
1
Karena Anda harus melewati operasi "hanya file" jika Anda zeadalah direktori. Mencoba melakukan operasi ini akan menyebabkan pengecualian.
Vasily Sochinsky
1
Jawaban ini seharusnya tidak berfungsi, karena tidak membuat file yang hilang untuk menulis data !!
Omar HossamEldin
1
Sebenarnya, kode ini tidak akan berfungsi jika file zip dibuat tanpa junk path, misalnya, Anda dapat menjalankan kode ini untuk unzip file APK, Anda akan mendapatkan FileNotFoundException.
Shaw
99
Berdasarkan jawaban Vasily Sochinsky sedikit tweak & dengan perbaikan kecil:
publicstaticvoid unzip(File zipFile,File targetDirectory)throwsIOException{ZipInputStream zis =newZipInputStream(newBufferedInputStream(newFileInputStream(zipFile)));try{ZipEntry ze;int count;byte[] buffer =newbyte[8192];while((ze = zis.getNextEntry())!=null){File file =newFile(targetDirectory, ze.getName());File dir = ze.isDirectory()? file : file.getParentFile();if(!dir.isDirectory()&&!dir.mkdirs())thrownewFileNotFoundException("Failed to ensure directory: "+
dir.getAbsolutePath());if(ze.isDirectory())continue;FileOutputStream fout =newFileOutputStream(file);try{while((count = zis.read(buffer))!=-1)
fout.write(buffer,0, count);}finally{
fout.close();}/* if time should be restored as well
long time = ze.getTime();
if (time > 0)
file.setLastModified(time);
*/}}finally{
zis.close();}}
Perbedaan yang mencolok
public static - ini adalah metode utilitas statis yang bisa di mana saja.
2 Fileparameter karena String: / untuk file dan satu tidak dapat menentukan di mana file zip akan diekstraksi sebelumnya. Juga path + filenameconcatenation> https://stackoverflow.com/a/412495/995891
throws- Karena terlambat menangkap - tambahkan try catch jika benar-benar tidak tertarik pada mereka.
sebenarnya memastikan bahwa direktori yang diperlukan ada di semua kasus. Tidak setiap zip berisi semua entri direktori yang diperlukan sebelum entri file. Ini memiliki 2 bug potensial:
jika zip berisi direktori kosong dan alih-alih direktori yang dihasilkan ada file yang ada, ini diabaikan. Nilai kembalinya mkdirs()penting.
bisa macet pada file zip yang tidak mengandung direktori.
peningkatan ukuran buffer tulis, ini akan meningkatkan kinerja sedikit. Penyimpanan biasanya dalam blok 4k dan menulis dalam potongan yang lebih kecil biasanya lebih lambat dari yang diperlukan.
menggunakan keajaiban finallyuntuk mencegah kebocoran sumber daya.
halo saya mendapatkan jalur dengan garis miring ke belakang seperti sdcard / temp / 768 \ 769.json jadi saya mendapatkan kesalahan, bisakah Anda memberi tahu saya cara mengelolanya
Ando Masahashi
@AndoMasahashi yang seharusnya menjadi nama file legal pada sistem file linux. Apa kesalahan yang Anda dapatkan dan bagaimana seharusnya nama file di akhir?
zapl
sepertinya /sdcard/pictures\picturess.jpeg dan file kesalahan tidak ditemukan kesalahan
Ando Masahashi
Ini berfungsi dengan baik, tapi itu melempar pengecualian ketika salah satu nama file di dalam zip tidak masuk UTF8 format. Jadi, saya menggunakan kode ini sebagai gantinya yang menggunakan commons-compresslib apache .
Sementara jawaban yang sudah ada di sini berfungsi dengan baik, saya menemukan bahwa mereka sedikit lebih lambat dari yang saya harapkan. Sebaliknya saya menggunakan zip4j , yang menurut saya merupakan solusi terbaik karena kecepatannya. Itu juga memungkinkan untuk opsi berbeda untuk jumlah kompresi, yang menurut saya berguna.
Menurut Anda apakah kode yang sama berfungsi untuk membuka ritsleting atau membongkar file ekspansi APK File Ekspansi obb?
LOG_TAG
2
Contoh minimal saya biasa unzip file tertentu dari zipfile saya ke folder cache aplikasi saya. Saya kemudian membaca file manifes menggunakan metode yang berbeda.
Saya bekerja dengan file zip yang tidak bisa ditangani oleh kelas ZipFile Java. Java 8 tampaknya tidak dapat menangani metode kompresi 12 (bzip2 saya percaya). Setelah mencoba sejumlah metode termasuk zip4j (yang juga gagal dengan file-file khusus ini karena masalah lain), saya berhasil dengan kompres commons-Apache yang mendukung metode kompresi tambahan seperti yang disebutkan di sini .
Perhatikan bahwa kelas ZipFile di bawah ini bukan yang dari java.util.zip.
Ini sebenarnya org.apache.commons.compress.archivers.zip.ZipFile jadi hati-hati dengan impor.
Saya selalu hanya melihat posting menggunakan byte[1024]atau byte[4096]buffer, tidak pernah tahu itu bisa jauh lebih besar yang meningkatkan kinerja dan masih berfungsi dengan normal.
//We pick a value that is the largest multiple of 4096 that is still smaller than the large object heap threshold (85K).// The CopyTo/CopyToAsync buffer is short-lived and is likely to be collected at Gen0, and it offers a significant// improvement in Copy performance.privateconstint_DefaultCopyBufferSize=81920;
Namun, saya memutarnya kembali 65536yang juga merupakan kelipatan 4096hanya untuk aman.
Dokumentasi perpustakaan ini cukup bagus, saya baru saja menambahkan beberapa contoh dari sana. Ini benar-benar gratis dan ditulis khusus untuk android.
Jawaban:
Apakah versi peno dioptimalkan sedikit. Peningkatan kinerja terlihat jelas.
sumber
ze
adalah direktori. Mencoba melakukan operasi ini akan menyebabkan pengecualian.Berdasarkan jawaban Vasily Sochinsky sedikit tweak & dengan perbaikan kecil:
Perbedaan yang mencolok
public static
- ini adalah metode utilitas statis yang bisa di mana saja.File
parameter karenaString
: / untuk file dan satu tidak dapat menentukan di mana file zip akan diekstraksi sebelumnya. Jugapath + filename
concatenation> https://stackoverflow.com/a/412495/995891throws
- Karena terlambat menangkap - tambahkan try catch jika benar-benar tidak tertarik pada mereka.mkdirs()
penting.finally
untuk mencegah kebocoran sumber daya.Begitu
harus melakukan yang setara dengan aslinya
sumber
UTF8 format
. Jadi, saya menggunakan kode ini sebagai gantinya yang menggunakancommons-compress
lib apache .Ini adalah metode unzip saya, yang saya gunakan:
sumber
Android memiliki built-in Java API. Lihat paket java.util.zip .
ZipInputStream kelas adalah apa yang harus Anda perhatikan. Baca ZipEntry dari ZipInputStream dan buang ke sistem file / folder. Lihat contoh serupa untuk mengompres menjadi file zip .
sumber
Cara Kotlin
Pemakaian
sumber
Sementara jawaban yang sudah ada di sini berfungsi dengan baik, saya menemukan bahwa mereka sedikit lebih lambat dari yang saya harapkan. Sebaliknya saya menggunakan zip4j , yang menurut saya merupakan solusi terbaik karena kecepatannya. Itu juga memungkinkan untuk opsi berbeda untuk jumlah kompresi, yang menurut saya berguna.
sumber
UPDATE 2016 menggunakan kelas berikut
Cara Penggunaan
Izin
sumber
Menurut jawaban zapl, Unzip dengan laporan kemajuan:
sumber
-> Helper Class (Unzipper.java)
-> tata letak xml (activity_main.xml):
-> izin dalam file Menifest:
sumber
Berikut ini adalah ZipFileIterator (seperti java Iterator, tetapi untuk file zip):
sumber
Contoh minimal saya biasa unzip file tertentu dari zipfile saya ke folder cache aplikasi saya. Saya kemudian membaca file manifes menggunakan metode yang berbeda.
sumber
Saya bekerja dengan file zip yang tidak bisa ditangani oleh kelas ZipFile Java. Java 8 tampaknya tidak dapat menangani metode kompresi 12 (bzip2 saya percaya). Setelah mencoba sejumlah metode termasuk zip4j (yang juga gagal dengan file-file khusus ini karena masalah lain), saya berhasil dengan kompres commons-Apache yang mendukung metode kompresi tambahan seperti yang disebutkan di sini .
Perhatikan bahwa kelas ZipFile di bawah ini bukan yang dari java.util.zip.
Ini sebenarnya org.apache.commons.compress.archivers.zip.ZipFile jadi hati-hati dengan impor.
Untuk Gradle:
sumber
Berdasarkan jawaban zapl, menambahkan
try()
sekitarCloseable
menutup aliran secara otomatis setelah digunakan.Menggunakan
Constant.DefaultBufferSize
(65536
) didapat dariC# .NET 4
Stream.CopyTo dari jawaban Jon Skeet di sini: https://stackoverflow.com/a/411605/1876355Saya selalu hanya melihat posting menggunakan
byte[1024]
ataubyte[4096]
buffer, tidak pernah tahu itu bisa jauh lebih besar yang meningkatkan kinerja dan masih berfungsi dengan normal.Berikut ini adalah
Stream
kode Sumber: https://referencesource.microsoft.com/#mscorlib/system/io/stream.csNamun, saya memutarnya kembali
65536
yang juga merupakan kelipatan4096
hanya untuk aman.sumber
File Zip Terlindungi Kata Sandi
jika Anda ingin mengompres file dengan kata sandi Anda dapat melihat di perpustakaan ini yang dapat dengan mudah zip file dengan kata sandi:
Zip:
Buka zip:
Rar:
Dokumentasi perpustakaan ini cukup bagus, saya baru saja menambahkan beberapa contoh dari sana. Ini benar-benar gratis dan ditulis khusus untuk android.
sumber