2013-07-01 3 views
2

я получаю следующий стек при создании ZipFile как:Попадая ArrayOutOfBounds при создании ZipFile

final ZipFile zipFile = new ZipFile(mDownloadedFile); 

Ошибка:

java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:299) 
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    at java.lang.Thread.run(Thread.java:856) 
    Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4096; regionStart=0; regionLength=-60060589 
    at java.util.Arrays.checkOffsetAndCount(Arrays.java:1731) 
    at libcore.io.IoBridge.read(IoBridge.java:427) 
    at java.io.RandomAccessFile.read(RandomAccessFile.java:290) 
    at java.util.zip.ZipFile$RAFStream.read(ZipFile.java:407) 
    at java.io.InputStream.read(InputStream.java:163) 
    at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:309) 
    at libcore.io.Streams.readFully(Streams.java:81) 
    at java.util.zip.ZipEntry.<init>(ZipEntry.java:353) 
    at java.util.zip.ZipFile.readCentralDir(ZipFile.java:365) 
    at java.util.zip.ZipFile.<init>(ZipFile.java:132) 
    at java.util.zip.ZipFile.<init>(ZipFile.java:103) 
    at xxx.android.task.xxTask.unzipFile(xxTask.java:250) 
    at xxx.android.task.xxTask.extract(xxTask.java:197) 
    at xxx.android.task.xxTask.doInBackground(xxTask.java:157) 
    at xxx.android.task.xxTask.doInBackground(xxTask.java:53) 
    at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    ... 4 more 

Я не могу сделать это, чтобы воспроизвести ошибку. Это просто где-то в мире, в реальном приложении, я получил эту ошибку через наш почтовый трекер.

Отрицательный регионLength = -60060589? Как это может быть возможным? Может ли это произойти, когда я пытаюсь создать файл с уже удаленным файлом на хранилище? Вроде: Загрузка - по какой-то причине и удаление файла - Загрузка снова - сбой.

EDIT: Файл mDownloadedFile - это файл, созданный до начала загрузки. В нормальном случае он создается с помощью нового, но в случае повтора (когда загрузка по какой-то причине была неудачной), он снова запускает задачу с файлом. Я удалил эту часть сейчас, потому что она не нужна, если это может быть ошибка, я исправил ее уже, но, возможно, кто-то знает что-то другое.

Некоторые фантазии? Благодаря

ответ

0

Some imaginations?

Вот моя попытка:
Если сохранить длину файла в int, то одна возможная причина может быть, что файлы с большим размером превышает максимально допустимое значение int может держать. Другими словами, числовое значение regionLength слишком велико, чтобы быть представлено int.
Вы можете подтвердить это, попробовав протестировать большой zip-файл, например, несколько ГБ. Если это так, то сохранение длины в long может решить проблему.

+0

приятное воображение. но это часть андроида. ZipFile - это класс android. Кроме того, мои zip-файлы никогда не бывают такими большими. Они arround от 50mb до 200mb – Informatic0re

+0

, но, возможно, он объединяет файлы, когда он создает новый файл из данного mDownloadedFile. И это закончится в действительно большом файле .. он объединяет файлы? – Informatic0re

+0

'все мои zip-файлы никогда не бывают такими большими. Они размером от 50 до 200 мБ. Это может не относиться к пользователям, которые используют ваше приложение. Имеет планшет или S3, который позволяет хранить до 64 ГБ и хранить большие файлы, изменяет ситуацию. У пользователей могут быть большие аудио, видеофайлы и т. Д. ... –

0

Я нашел строку кода:

FileOutputStream fileOutputStream = new FileOutputStream(mDownloadedFile, true); 

Второй параметр является добавление и означает:

If append is true and the file already exists, it will be appended to; otherwise it will be truncated.

В худшем случае это случилось бесконечны из-за функции повторной попытки. Обычный случай - 5 попыток загрузки и распаковки. Но в худшем случае это произошло бесконечно, и файл будет большим, как черт.

Благодаря Энди Рес и его воображению, это был ключ к поиску этой линии :-)