Moja aplikacja pobiera plik ZIP zawierający około 350 plików. Mieszanka plików JPG i HTML. Funkcja, którą napisałem, aby to zrobić działa dobrze, ale rozpakowywanie trwa na zawsze. Na początku myślałem, że powodem może być to, że pisanie na kartę SD jest powolne. ale kiedy rozpakuję ten sam zip w innej aplikacji na moim telefonie, działa znacznie szybciej. czy jest coś, co mógłbym zrobić, żeby ją zoptymalizować?Extrakting Zip na kartę SD jest bardzo wolny. Jak mogę zoptymalizować wydajność?
oto kod:
private void extract() {
try {
FileInputStream inStream = new FileInputStream(targetFilePath);
ZipInputStream zipStream = new ZipInputStream(new BufferedInputStream(inStream));
ZipEntry entry;
ZipFile zip = new ZipFile(targetFilePath);
//i know the contents for the zip so i create the dirs i need in advance
new File(targetFolder).mkdirs();
new File(targetFolder + "META-INF").mkdir();
new File(targetFolder + "content").mkdir();
int extracted = 0;
while((entry = zipStream.getNextEntry()) != null) {
if (entry.isDirectory()) {
new File(targetFolder + entry.getName()).mkdirs();
} else {
FileOutputStream outStream = new FileOutputStream(targetFolder + entry.getName());
for (int c = zipStream.read(); c != -1; c = zipStream.read()) {
outStream.write(c);
}
zipStream.closeEntry();
outStream.close();
extracted ++;
}
publishProgress(""+(int)extracted*100/zip.size());
}
zipStream.close();
inStream.close();
//
new File(targetFilePath).delete();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
dzięki CommonsWare zmodyfikowałem mój kod tak:
int size;
byte[] buffer = new byte[2048];
FileOutputStream outStream = new FileOutputStream(targetFolder + entry.getName());
BufferedOutputStream bufferOut = new BufferedOutputStream(outStream, buffer.length);
while((size = zipStream.read(buffer, 0, buffer.length)) != -1) {
bufferOut.write(buffer, 0, size);
}
bufferOut.flush();
bufferOut.close();
duża różnica wydajności. Wielkie dzięki.
dzięki! To rzeczywiście zrobiło Sztuczkę. – notme
Link podany w tej odpowiedzi nie działa. –
@CommonsWare Link jest wyłączony. Czy mógłbyś to naprawić? – Scorchio