2013-12-18 3 views
2

Я должен делать что-то действительно не так. Запустив следующий код на Android, он производит усеченный файл (_items_) без каких-либо исключений или проблем в журнале. Выполняя тот же код с OpenJDK 7, он правильно распаковывает файл.Усеченный вывод из GZIPInputStream на Android

try { 
    final InputStream fis = new GZIPInputStream(new FileInputStream("/storage/sdcard/_items")); 
    try { 
     final FileOutputStream fos = new FileOutputStream("/storage/sdcard/_items_"); 
     try { 
      final byte[] buffer = new byte[1024]; 
      int n; 
      while ((n = fis.read(buffer)) != -1) { 
       fos.write(buffer, 0, n); 
      } 
     } finally { 
      fos.close(); 
     } 
    } finally { 
     fis.close(); 
    } 
} catch (final IOException e) { 
    e.printStackTrace(); 
    throw new RuntimeException(e); 
} 

Я попытался это с Android эмулятор (API 18) и на Desire HD (Android 2.3.5) с тем же результатом багги.

входного файла (_items): https://drive.google.com/file/d/0B6M72P2gzYmwaHg4SzRTYnRMOVk/edit?usp=sharing

Android усеченный выходного файла (_items_): https://drive.google.com/file/d/0B6M72P2gzYmwMUZIZ2FEaHNZUFk/edit?usp=sharing

+0

Я вижу такое же поведение. Пожалуйста, зарегистрируйте ошибку на http://b.android.com/. – fadden

+0

Выполнено - https://code.google.com/p/android/issues/detail?id=63873. Любая идея обходного пути? –

+0

Я не знаю, поможет ли вам это, но повторное сжатие файла (gunzip then gzip) привело к сжатому файлу данных, который был правильно обработан моим устройством. Что вы использовали для сжатия данных? – fadden

ответ

1

Обходным путем является использование GZIPInputStream от JZlib (в настоящее время только в concatenated_gzip_streams ветке). См. https://github.com/ymnk/jzlib/issues/12 для более подробной информации.

1

AOSP bug был обновлен с анализом инженером из команды Dalvik.

Реферат: поток gzip объединяет multiple members, и, как ожидается, декомпрессор обрабатывает их все, но реализация Dalvik останавливается после первого.

Если есть способ убедить источник данных сжимать свои потоки по-разному, вам нужно будет найти замену для GZIPInputStream.