Android: более быстрый способ чтения / записи ZipInputStream? - PullRequest
4 голосов
/ 28 июля 2011

В настоящее время я пишу приложение, которое читает zip-файл в моей папке ресурсов, который содержит кучу изображений.Я использую ZipInputStream API для чтения содержимого, а затем записываю каждый файл в мой каталог: Environment.getExternalStorageDirectory().У меня все работает, но при первом запуске приложения запись изображений в каталог хранилища невероятно медленная.Запись моих изображений на диск занимает около 5 минут.Мой код выглядит так:

ZipEntry ze = null;
ZipInputStream zin = new ZipInputStream(getAssets().open("myFile.zip"));
String location = getExternalStorageDirectory().getAbsolutePath() + "/test/images/";

    //Loop through the zip file
    while ((ze = zin.getNextEntry()) != null) {
         File f = new File(location + ze.getName());
          //Doesn't exist? Create to avoid FileNotFoundException
          if(f.exists()) {
             f.createNewFile();
          }
          FileOutputStream fout = new FileOutputStream(f);
          //Read contents and then write to file
          for (c = zin.read(); c != -1; c = zin.read()) {
             fout.write(c);
          }             
    }
    fout.close();
    zin.close();

Процесс чтения содержимого определенной записи и последующей записи в нее ОЧЕНЬ медленный.Я предполагаю, что это больше связано с чтением, чем письмом.Я читал, что вы можете использовать буфер массива byte[] для ускорения процесса, но это, похоже, не работает!Я пробовал это, но он только читает часть файла ...

    FileOutputStream fout = new FileOutputStream(f);
    byte[] buffer = new byte[(int)ze.getSize()];
     //Read contents and then write to file
      for (c = zin.read(buffer); c != -1; c = zin.read(buffer)) {
            fout.write(c);
      }             
  }

Когда я делаю это, я получаю только около 600-800 байт.Есть ли способ ускорить это?Я неправильно реализовал буферный массив ??

Ответы [ 2 ]

12 голосов
/ 30 июля 2011

Я нашел гораздо лучшее решение, которое реализует API BuffererdOutputStream. Мое решение выглядит так:

   byte[] buffer = new byte[2048];

   FileOutputStream fout = new FileOutputStream(f);
   BufferedOutputStream bos = new BufferedOutputStream(fout, buffer.length);

   int size;

    while ((size = zin.read(buffer, 0, buffer.length)) != -1) {
            bos.write(buffer, 0, size);
        }
        //Close up shop..
        bos.flush();
        bos.close();

        fout.flush();
        fout.close();
        zin.closeEntry();

Мне удалось увеличить время загрузки с любого места в среднем с 5 минут до 5 (в зависимости от того, сколько изображений в упаковке). Надеюсь, это поможет!

0 голосов
/ 28 июля 2011

Попробуйте использовать http://commons.apache.org/io/ как:

 InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
 try {
   System.out.println( IOUtils.toString( in ) );
 } finally {
   IOUtils.closeQuietly(in);
 }
...