Как разархивировать файлы программно в Android?

Простейшим решением оказалось настройка pool: false, весь запрос выглядит так:

HTTPoison.get(url, [], [
  timeout: 5_000,
  recv_timeout: 5_000,
  proxy: proxy,
  hackney: [pool: false],
  ssl: [{:versions, [:'tlsv1.2']}]
])
123
задан Peter O. 9 April 2013 в 01:28
поделиться

2 ответа

На основе ответа zapl, добавляя try() приблизительно Closeable завершения потоки автоматически после использования.

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
    }
}

Используя Constant.DefaultBufferSize (65536) полученный от C# .NET 4 Поток. CopyTo из ответа Jon Skeet здесь: https://stackoverflow.com/a/411605/1876355

я всегда просто вижу, что сообщения используют byte[1024] или byte[4096] буфер, никогда не знал, что это может быть намного больше, который улучшает производительность и все еще работает совершенно нормальный.

Вот Stream Исходный код: https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs

//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.

private const int _DefaultCopyBufferSize = 81920;

Однако я набрал его назад к [1 110], который является также несколькими из [1 111] только для сейфа.

0
ответ дан 24 November 2019 в 01:12
поделиться

Android имеет встроенный Java API. Посмотрите пакет java.util.zip .

Вам следует изучить класс ZipInputStream . Прочтите ZipEntry из ZipInputStream и скопируйте его в файловую систему / папку. Посмотрите аналогичный пример для сжатия в файл zip .

13
ответ дан 24 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: