Jak programowo rozpakować pliki w systemie Android?
133
Potrzebuję małego fragmentu kodu, który rozpakowuje kilka plików z danego pliku .zip i podaje oddzielne pliki zgodnie z formatem, w jakim były w spakowanym pliku. Proszę opublikuj swoją wiedzę i pomóż mi.
<używa-pozwolenia android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Lou Morda,
1
Myślę, że tak, działa, ponieważ jest to bardzo zwyczajny sposób rozpakowywania rzeczy. Po prostu uzyskaj właściwą „ścieżkę” i „nazwę zip”. Ja również widziałem kilka rzeczy może być zainteresowany (pewien, że widziałem go już jednak): Opinie
Wasilij Sochinsky
1
Ponieważ musisz pominąć operacje „tylko na plikach”, jeśli twój zejest katalogiem. Próba wykonania tych operacji spowoduje wyjątek.
Wasilij Sochinsky
1
Ta odpowiedź nie powinna działać, ponieważ nie tworzy brakujących plików do zapisywania danych !!
Omar HossamEldin
1
W rzeczywistości ten kod nie zadziała, jeśli plik zip zostanie utworzony bez ścieżki śmieciowej, na przykład możesz uruchomić ten kod, aby rozpakować plik APK, otrzymasz FileNotFoundException.
Shaw
103
W oparciu o odpowiedź Wasilija Sochinsky'ego, nieco poprawioną i z małą poprawką:
publicstaticvoidunzip(File zipFile, File targetDirectory)throws IOException {
ZipInputStream zis = new ZipInputStream(
new BufferedInputStream(new FileInputStream(zipFile)));
try {
ZipEntry ze;
int count;
byte[] buffer = newbyte[8192];
while ((ze = zis.getNextEntry()) != null) {
File file = new File(targetDirectory, ze.getName());
File dir = ze.isDirectory() ? file : file.getParentFile();
if (!dir.isDirectory() && !dir.mkdirs())
thrownew FileNotFoundException("Failed to ensure directory: " +
dir.getAbsolutePath());
if (ze.isDirectory())
continue;
FileOutputStream fout = new FileOutputStream(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();
}
}
Znaczące różnice
public static - jest to statyczna metoda narzędzia, która może być wszędzie.
2 File, ponieważ Stringsą to: / dla plików i nie można było określić, gdzie plik zip ma zostać rozpakowany wcześniej. Również path + filenamekonkatenacja> https://stackoverflow.com/a/412495/995891
throws- ponieważ łapie późno - dodaj próbę złapania, jeśli naprawdę nie jesteś nimi zainteresowany.
faktycznie upewnia się, że wymagane katalogi istnieją we wszystkich przypadkach. Nie każdy plik ZIP zawiera wszystkie wymagane wpisy katalogu przed wpisami plików. To miało 2 potencjalne błędy:
jeśli plik zip zawiera pusty katalog, a zamiast katalogu wynikowego istnieje istniejący plik, zostało to zignorowane. Wartość zwracana mkdirs()jest ważna.
może spowodować awarię plików zip, które nie zawierają katalogów.
zwiększony rozmiar bufora zapisu, to powinno nieco poprawić wydajność. Przechowywanie jest zwykle w blokach 4k, a pisanie w mniejszych fragmentach jest zwykle wolniejsze niż to konieczne.
wykorzystuje magię programu finallydo zapobiegania wyciekom zasobów.
Więc
unzip(new File("/sdcard/pictures.zip"), new File("/sdcard"));
cześć, otrzymuję ścieżkę z ukośnikiem wstecznym, jak sdcard / temp / 768 \ 769.json, więc pojawia się błąd, czy możesz mi powiedzieć, jak sobie z tym poradzić
Ando Masahashi
@AndoMasahashi, która powinna być poprawną nazwą pliku w systemie plików Linux. Jaki błąd otrzymujesz i jak powinna wyglądać nazwa pliku na końcu?
zapl
wygląda jak /sdcard/pictures\picturess.jpeg i nie znaleziono pliku błędu błąd
Ando Masahashi
Działa dobrze, ale zgłasza wyjątek, gdy jednej z nazw plików w pliku zip nie ma UTF8 format. Więc zamiast tego użyłem tego kodu, który używa commons-compressbiblioteki Apache .
Czy uważasz, że ten sam kod działa przy rozpakowywaniu lub rozpakowywaniu rozszerzeń plików rozszerzeń APK plików obb?
LOG_TAG
13
Android ma wbudowany interfejs Java API. Sprawdź pakiet java.util.zip .
Klasa ZipInputStream jest tym, czego należy się przyjrzeć. Przeczytaj ZipEntry z ZipInputStream i wrzuć go do systemu plików / folderu. Sprawdź podobny przykład kompresji do pliku zip .
Chociaż odpowiedzi, które są już tutaj, działają dobrze, stwierdziłem, że były nieco wolniejsze, niż się spodziewałem. Zamiast tego użyłem zip4j , który moim zdaniem jest najlepszym rozwiązaniem ze względu na jego szybkość. Pozwoliło to również na różne opcje wielkości kompresji, które uznałem za przydatne.
Czy uważasz, że ten sam kod działa przy rozpakowywaniu lub rozpakowywaniu rozszerzeń plików rozszerzeń APK plików obb?
LOG_TAG
2
Minimalny przykład Użyłem do rozpakowania określonego pliku z mojego pliku zip do folderu pamięci podręcznej aplikacji. Następnie czytam plik manifestu przy użyciu innej metody.
privatevoidunzipUpdateToCache(){
ZipInputStream zipIs = new ZipInputStream(context.getResources().openRawResource(R.raw.update));
ZipEntry ze = null;
try {
while ((ze = zipIs.getNextEntry()) != null) {
if (ze.getName().equals("update/manifest.json")) {
FileOutputStream fout = new FileOutputStream(context.getCacheDir().getAbsolutePath() + "/manifest.json");
byte[] buffer = newbyte[1024];
int length = 0;
while ((length = zipIs.read(buffer))>0) {
fout.write(buffer, 0, length);
}
zipIs .closeEntry();
fout.close();
}
}
zipIs .close();
} catch (IOException e) {
e.printStackTrace();
}
}
Pracuję z plikami zip, których klasa ZipFile Javy nie jest w stanie obsłużyć. Java 8 najwyraźniej nie radzi sobie z metodą kompresji 12 (wydaje mi się, że bzip2). Po wypróbowaniu wielu metod, w tym zip4j (który również nie działa z tymi konkretnymi plikami z powodu innego problemu), odniosłem sukces z programem commons-kompresu Apache, który obsługuje dodatkowe metody kompresji, jak wspomniano tutaj .
Zauważ, że poniższa klasa ZipFile nie pochodzi z klasy java.util.zip.
W rzeczywistości jest to org.apache.commons.compress.archivers.zip.ZipFile, więc zachowaj ostrożność podczas importu.
try (ZipFile zipFile = new ZipFile(archiveFile)) {
Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
File entryDestination = new File(destination, entry.getName());
if (entry.isDirectory()) {
entryDestination.mkdirs();
} else {
entryDestination.getParentFile().mkdirs();
try (InputStream in = zipFile.getInputStream(entry); OutputStream out = new FileOutputStream(entryDestination)) {
IOUtils.copy(in, out);
}
}
}
} catch (IOException ex) {
log.debug("Error unzipping archive file: " + archiveFile, ex);
}
Zawsze widzę posty używające byte[1024]lub byte[4096]buforujące, nigdy nie wiedziałem, że może być znacznie większy, co poprawia wydajność i nadal działa idealnie normalnie.
//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;
Jednak wybrałem numer z powrotem, 65536co również jest wielokrotnością liczby, 4096aby być bezpiecznym.
Odpowiedzi:
Wersja Peno została nieco zoptymalizowana. Wzrost wydajności jest zauważalny.
private boolean unpackZip(String path, String zipname) { InputStream is; ZipInputStream zis; try { String filename; is = new FileInputStream(path + zipname); zis = new ZipInputStream(new BufferedInputStream(is)); ZipEntry ze; byte[] buffer = new byte[1024]; int count; while ((ze = zis.getNextEntry()) != null) { filename = ze.getName(); // Need to create directories if not exists, or // it will generate an Exception... if (ze.isDirectory()) { File fmd = new File(path + filename); fmd.mkdirs(); continue; } FileOutputStream fout = new FileOutputStream(path + filename); while ((count = zis.read(buffer)) != -1) { fout.write(buffer, 0, count); } fout.close(); zis.closeEntry(); } zis.close(); } catch(IOException e) { e.printStackTrace(); return false; } return true; }
źródło
ze
jest katalogiem. Próba wykonania tych operacji spowoduje wyjątek.W oparciu o odpowiedź Wasilija Sochinsky'ego, nieco poprawioną i z małą poprawką:
public static void unzip(File zipFile, File targetDirectory) throws IOException { ZipInputStream zis = new ZipInputStream( new BufferedInputStream(new FileInputStream(zipFile))); try { ZipEntry ze; int count; byte[] buffer = new byte[8192]; while ((ze = zis.getNextEntry()) != null) { File file = new File(targetDirectory, ze.getName()); File dir = ze.isDirectory() ? file : file.getParentFile(); if (!dir.isDirectory() && !dir.mkdirs()) throw new FileNotFoundException("Failed to ensure directory: " + dir.getAbsolutePath()); if (ze.isDirectory()) continue; FileOutputStream fout = new FileOutputStream(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(); } }
Znaczące różnice
public static
- jest to statyczna metoda narzędzia, która może być wszędzie.File
, ponieważString
są to: / dla plików i nie można było określić, gdzie plik zip ma zostać rozpakowany wcześniej. Równieżpath + filename
konkatenacja> https://stackoverflow.com/a/412495/995891throws
- ponieważ łapie późno - dodaj próbę złapania, jeśli naprawdę nie jesteś nimi zainteresowany.mkdirs()
jest ważna.finally
do zapobiegania wyciekom zasobów.Więc
unzip(new File("/sdcard/pictures.zip"), new File("/sdcard"));
powinien zrobić odpowiednik oryginału
unpackZip("/sdcard/", "pictures.zip")
źródło
UTF8 format
. Więc zamiast tego użyłem tego kodu, który używacommons-compress
biblioteki Apache .Oto moja metoda rozpakowywania, której używam:
private boolean unpackZip(String path, String zipname) { InputStream is; ZipInputStream zis; try { is = new FileInputStream(path + zipname); zis = new ZipInputStream(new BufferedInputStream(is)); ZipEntry ze; while((ze = zis.getNextEntry()) != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int count; String filename = ze.getName(); FileOutputStream fout = new FileOutputStream(path + filename); // reading and writing while((count = zis.read(buffer)) != -1) { baos.write(buffer, 0, count); byte[] bytes = baos.toByteArray(); fout.write(bytes); baos.reset(); } fout.close(); zis.closeEntry(); } zis.close(); } catch(IOException e) { e.printStackTrace(); return false; } return true; }
źródło
Android ma wbudowany interfejs Java API. Sprawdź pakiet java.util.zip .
Klasa ZipInputStream jest tym, czego należy się przyjrzeć. Przeczytaj ZipEntry z ZipInputStream i wrzuć go do systemu plików / folderu. Sprawdź podobny przykład kompresji do pliku zip .
źródło
Droga Kotlina
//FileExt.kt data class ZipIO (val entry: ZipEntry, val output: File) fun File.unzip(unzipLocationRoot: File? = null) { val rootFolder = unzipLocationRoot ?: File(parentFile.absolutePath + File.separator + nameWithoutExtension) if (!rootFolder.exists()) { rootFolder.mkdirs() } ZipFile(this).use { zip -> zip .entries() .asSequence() .map { val outputFile = File(rootFolder.absolutePath + File.separator + it.name) ZipIO(it, outputFile) } .map { it.output.parentFile?.run{ if (!exists()) mkdirs() } it } .filter { !it.entry.isDirectory } .forEach { (entry, output) -> zip.getInputStream(entry).use { input -> output.outputStream().use { output -> input.copyTo(output) } } } } }
Stosowanie
val zipFile = File("path_to_your_zip_file") file.unzip()
źródło
Chociaż odpowiedzi, które są już tutaj, działają dobrze, stwierdziłem, że były nieco wolniejsze, niż się spodziewałem. Zamiast tego użyłem zip4j , który moim zdaniem jest najlepszym rozwiązaniem ze względu na jego szybkość. Pozwoliło to również na różne opcje wielkości kompresji, które uznałem za przydatne.
źródło
użyj następującej klasy
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.util.Log; public class DecompressFast { private String _zipFile; private String _location; public DecompressFast(String zipFile, String location) { _zipFile = zipFile; _location = location; _dirChecker(""); } public void unzip() { try { FileInputStream fin = new FileInputStream(_zipFile); ZipInputStream zin = new ZipInputStream(fin); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v("Decompress", "Unzipping " + ze.getName()); if(ze.isDirectory()) { _dirChecker(ze.getName()); } else { FileOutputStream fout = new FileOutputStream(_location + ze.getName()); BufferedOutputStream bufout = new BufferedOutputStream(fout); byte[] buffer = new byte[1024]; int read = 0; while ((read = zin.read(buffer)) != -1) { bufout.write(buffer, 0, read); } bufout.close(); zin.closeEntry(); fout.close(); } } zin.close(); Log.d("Unzip", "Unzipping complete. path : " +_location ); } catch(Exception e) { Log.e("Decompress", "unzip", e); Log.d("Unzip", "Unzipping failed"); } } private void _dirChecker(String dir) { File f = new File(_location + dir); if(!f.isDirectory()) { f.mkdirs(); } } }
Jak używać
String zipFile = Environment.getExternalStorageDirectory() + "/the_raven.zip"; //your zip file location String unzipLocation = Environment.getExternalStorageDirectory() + "/unzippedtestNew/"; // destination folder location DecompressFast df= new DecompressFast(zipFile, unzipLocation); df.unzip();
Uprawnienia
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
źródło
Zgodnie z odpowiedzią @zapl, Rozpakuj z raportem postępu:
public interface UnzipFile_Progress { void Progress(int percent, String FileName); } // unzip(new File("/sdcard/pictures.zip"), new File("/sdcard")); public static void UnzipFile(File zipFile, File targetDirectory, UnzipFile_Progress progress) throws IOException, FileNotFoundException { long total_len = zipFile.length(); long total_installed_len = 0; ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile))); try { ZipEntry ze; int count; byte[] buffer = new byte[1024]; while ((ze = zis.getNextEntry()) != null) { if (progress != null) { total_installed_len += ze.getCompressedSize(); String file_name = ze.getName(); int percent = (int)(total_installed_len * 100 / total_len); progress.Progress(percent, file_name); } File file = new File(targetDirectory, ze.getName()); File dir = ze.isDirectory() ? file : file.getParentFile(); if (!dir.isDirectory() && !dir.mkdirs()) throw new FileNotFoundException("Failed to ensure directory: " + dir.getAbsolutePath()); if (ze.isDirectory()) continue; FileOutputStream fout = new FileOutputStream(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(); } }
źródło
public class MainActivity extends Activity { private String LOG_TAG = MainActivity.class.getSimpleName(); private File zipFile; private File destination; private TextView status; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); status = (TextView) findViewById(R.id.main_status); status.setGravity(Gravity.CENTER); if ( initialize() ) { zipFile = new File(destination, "BlueBoxnew.zip"); try { Unzipper.unzip(zipFile, destination); status.setText("Extracted to \n"+destination.getAbsolutePath()); } catch (ZipException e) { Log.e(LOG_TAG, e.getMessage()); } catch (IOException e) { Log.e(LOG_TAG, e.getMessage()); } } else { status.setText("Unable to initialize sd card."); } } public boolean initialize() { boolean result = false; File sdCard = new File(Environment.getExternalStorageDirectory()+"/zip/"); //File sdCard = Environment.getExternalStorageDirectory(); if ( sdCard != null ) { destination = sdCard; if ( !destination.exists() ) { if ( destination.mkdir() ) { result = true; } } else { result = true; } } return result; } }
-> Klasa pomocnicza (Unzipper.java)
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipInputStream; import android.util.Log; public class Unzipper { private static String LOG_TAG = Unzipper.class.getSimpleName(); public static void unzip(final File file, final File destination) throws ZipException, IOException { new Thread() { public void run() { long START_TIME = System.currentTimeMillis(); long FINISH_TIME = 0; long ELAPSED_TIME = 0; try { ZipInputStream zin = new ZipInputStream(new FileInputStream(file)); String workingDir = destination.getAbsolutePath()+"/"; byte buffer[] = new byte[4096]; int bytesRead; ZipEntry entry = null; while ((entry = zin.getNextEntry()) != null) { if (entry.isDirectory()) { File dir = new File(workingDir, entry.getName()); if (!dir.exists()) { dir.mkdir(); } Log.i(LOG_TAG, "[DIR] "+entry.getName()); } else { FileOutputStream fos = new FileOutputStream(workingDir + entry.getName()); while ((bytesRead = zin.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } fos.close(); Log.i(LOG_TAG, "[FILE] "+entry.getName()); } } zin.close(); FINISH_TIME = System.currentTimeMillis(); ELAPSED_TIME = FINISH_TIME - START_TIME; Log.i(LOG_TAG, "COMPLETED in "+(ELAPSED_TIME/1000)+" seconds."); } catch (Exception e) { Log.e(LOG_TAG, "FAILED"); } }; }.start(); } }
-> układ xml (activity_main.xml):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:id="@+id/main_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> </RelativeLayout>
-> uprawnienia w pliku Menifest:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
źródło
Oto ZipFileIterator (jak Iterator java, ale dla plików zip):
package ch.epfl.bbp.io; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ZipFileIterator implements Iterator<File> { private byte[] buffer = new byte[1024]; private FileInputStream is; private ZipInputStream zis; private ZipEntry ze; public ZipFileIterator(File file) throws FileNotFoundException { is = new FileInputStream(file); zis = new ZipInputStream(new BufferedInputStream(is)); } @Override public boolean hasNext() { try { return (ze = zis.getNextEntry()) != null; } catch (IOException e) { e.printStackTrace(); } return false; } @Override public File next() { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int count; String filename = ze.getName(); File tmpFile = File.createTempFile(filename, "tmp"); tmpFile.deleteOnExit();// TODO make it configurable FileOutputStream fout = new FileOutputStream(tmpFile); while ((count = zis.read(buffer)) != -1) { baos.write(buffer, 0, count); byte[] bytes = baos.toByteArray(); fout.write(bytes); baos.reset(); } fout.close(); zis.closeEntry(); return tmpFile; } catch (Exception e) { throw new RuntimeException(e); } } @Override public void remove() { throw new RuntimeException("not implemented"); } public void close() { try { zis.close(); is.close(); } catch (IOException e) {// nope } } }
źródło
Minimalny przykład Użyłem do rozpakowania określonego pliku z mojego pliku zip do folderu pamięci podręcznej aplikacji. Następnie czytam plik manifestu przy użyciu innej metody.
private void unzipUpdateToCache() { ZipInputStream zipIs = new ZipInputStream(context.getResources().openRawResource(R.raw.update)); ZipEntry ze = null; try { while ((ze = zipIs.getNextEntry()) != null) { if (ze.getName().equals("update/manifest.json")) { FileOutputStream fout = new FileOutputStream(context.getCacheDir().getAbsolutePath() + "/manifest.json"); byte[] buffer = new byte[1024]; int length = 0; while ((length = zipIs.read(buffer))>0) { fout.write(buffer, 0, length); } zipIs .closeEntry(); fout.close(); } } zipIs .close(); } catch (IOException e) { e.printStackTrace(); } }
źródło
Pracuję z plikami zip, których klasa ZipFile Javy nie jest w stanie obsłużyć. Java 8 najwyraźniej nie radzi sobie z metodą kompresji 12 (wydaje mi się, że bzip2). Po wypróbowaniu wielu metod, w tym zip4j (który również nie działa z tymi konkretnymi plikami z powodu innego problemu), odniosłem sukces z programem commons-kompresu Apache, który obsługuje dodatkowe metody kompresji, jak wspomniano tutaj .
Zauważ, że poniższa klasa ZipFile nie pochodzi z klasy java.util.zip.
W rzeczywistości jest to org.apache.commons.compress.archivers.zip.ZipFile, więc zachowaj ostrożność podczas importu.
try (ZipFile zipFile = new ZipFile(archiveFile)) { Enumeration<ZipArchiveEntry> entries = zipFile.getEntries(); while (entries.hasMoreElements()) { ZipArchiveEntry entry = entries.nextElement(); File entryDestination = new File(destination, entry.getName()); if (entry.isDirectory()) { entryDestination.mkdirs(); } else { entryDestination.getParentFile().mkdirs(); try (InputStream in = zipFile.getInputStream(entry); OutputStream out = new FileOutputStream(entryDestination)) { IOUtils.copy(in, out); } } } } catch (IOException ex) { log.debug("Error unzipping archive file: " + archiveFile, ex); }
Dla Gradle:
compile 'org.apache.commons:commons-compress:1.18'
źródło
Opierając się na odpowiedzi zapl, dodanie
try()
dookołaCloseable
zamyka strumienie automatycznie po użyciu.public static void unzip(File zipFile, File targetDirectory) { try (FileInputStream fis = new FileInputStream(zipFile)) { try (BufferedInputStream bis = new BufferedInputStream(fis)) { try (ZipInputStream zis = new ZipInputStream(bis)) { ZipEntry ze; int count; byte[] buffer = new byte[Constant.DefaultBufferSize]; while ((ze = zis.getNextEntry()) != null) { File file = new File(targetDirectory, ze.getName()); File dir = ze.isDirectory() ? file : file.getParentFile(); if (!dir.isDirectory() && !dir.mkdirs()) throw new FileNotFoundException("Failed to ensure directory: " + dir.getAbsolutePath()); if (ze.isDirectory()) continue; try (FileOutputStream fout = new FileOutputStream(file)) { while ((count = zis.read(buffer)) != -1) fout.write(buffer, 0, count); } } } } } catch (Exception ex) { //handle exception } }
Używanie
Constant.DefaultBufferSize
(65536
)C# .NET 4
pobrane z Stream.CopyTo z odpowiedzi Jona Skeeta tutaj: https://stackoverflow.com/a/411605/1876355Zawsze widzę posty używające
byte[1024]
lubbyte[4096]
buforujące, nigdy nie wiedziałem, że może być znacznie większy, co poprawia wydajność i nadal działa idealnie normalnie.Oto
Stream
kod źródłowy: https://referencesource.microsoft.com/#mscorlib/system/io/stream.csJednak wybrałem numer z powrotem,
65536
co również jest wielokrotnością liczby,4096
aby być bezpiecznym.źródło
Plik ZIP chroniony hasłem
jeśli chcesz skompresować pliki za pomocą hasła, możesz spojrzeć na tę bibliotekę, która może łatwo spakować pliki z hasłem:
Zamek błyskawiczny:
ZipArchive zipArchive = new ZipArchive(); zipArchive.zip(targetPath,destinationPath,password);
Rozsunąć suwak:
ZipArchive zipArchive = new ZipArchive(); zipArchive.unzip(targetPath,destinationPath,password);
Rar:
RarArchive rarArchive = new RarArchive(); rarArchive.extractArchive(file archive, file destination);
Dokumentacja tej biblioteki jest wystarczająco dobra, dodałem tylko kilka przykładów. Jest całkowicie darmowy i napisany specjalnie dla Androida.
źródło