2013-07-25 2 views
1

Я пытаюсь скопировать большое количество папок и вложенных папок из моей папки ресурсов apk на мою SD-карту быстро. папки содержат 12 Мбайт небольших файлов, возможно, всего 2500. Пример кода из этого вопроса SO работает, но он занимает более 5 минут на моем устройстве. Есть ли более быстрый способ сделать это?Скопируйте папку размером 12 МБ с 2500 файлами с активов на SD-карту быстро

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

+1

А как читать файлы из архивного файла вместо дерева директорий и поддиректоров? (т. е. zip без сжатия). В этом случае у вас есть только файл для копирования. –

+0

@DJHell Это отличная идея. Половина файлов - это PNG-изображения, другая половина - текстовые файлы. Как я могу ссылаться на расположение этих файлов через мой код. Im, предполагающий 'Environment.getExternalStorageDirectory() + File.separator +" appFolder "+ File.separator +" files.zip "\t + File.separator +" image.png "' не работает – Peter

+0

@MiroMarkarian Я создаю это приложение для продажи в Google Play, так что это не возможность сообщать пользователям. Также у моего телефона нет SD-карты, кроме эмулируемой. – Peter

ответ

1

У меня были очень хорошие, стабильные результаты с создавая zip-файл, помещая его в raw или активы в мое приложение и разархивируя его, когда пользователь сначала открывает приложение. Я бы порекомендовал вам сделать еще один снимок, так как меня впечатлило, что я видел нулевые проблемы с сотнями инсталляций.

Учебников я основывал вспомогательные методы застегнуть и расстегнуть молнию файлов здесь: Unzipping Files w/ Android и Zipping Files w/ Android

Следует отметить, что я использовал API Java для создания молнии, что я включаю с устанавливаете мое приложение. Возможно, поэтому у меня были такие последовательные результаты, которые также распаковывали их, используя Java API в Android.

Надеюсь, это поможет! Удачи!

1

12mb должны сэкономить немного быстрее, что, если вы используете методы из других SO question, попробуйте увеличить размер буфера в copyFile, как это так,

private void copyFile(InputStream in, OutputStream out) throws IOException { 
    byte[] buffer = new byte[8192]; // 1024 is kind small,..try 8192 or 4096!! 
    int read; 
    while((read = in.read(buffer)) != -1){ 
     out.write(buffer, 0, read); 
    } 
} 
+0

Увеличивает размер буфера, вызывающего проблемы на устройствах нижнего уровня? – Peter

+0

если он слишком большой, да .... но я использую 8192 (что должно быть прекрасно для нижнего конца) с тех пор, как молния вышла для большинства моих вещей, из-за этого промаха htc. http://stackoverflow.com/questions/5358014/android-httpclient-oom-on-4g-lte-htc-thunderbolt – petey

+0

Мое приложение поддерживает Android 2.2 и выше, хотя только 1.5% - 2.2, остальные 2.3.3 и выше (почти 65% - 4,0 и выше). Считаете ли вы, что я вызову любые проблемы для устройств 2.2, которые это делают? Из того, что я помню, молния составляет 2,2 или 2,3? – Peter

Смежные вопросы