Недостаточно памяти при загрузке файла - PullRequest
1 голос
/ 04 января 2012
HttpResponse responseGet;
        try {
            responseGet = client.execute(get);
            switch (responseGet.getStatusLine().getStatusCode()) {
            case 200:
                File SDCardRoot = Environment.getExternalStorageDirectory();
                File directory = new File(SDCardRoot
                        + "/OfflineDocuments/"
                        + (document.getPath() == null ? ""
                                : (document.getPath() + "/")));
                directory.mkdirs();
                File file = new File(directory, fileName);
                InputStream is = responseGet.getEntity().getContent();
                BufferedInputStream bis = new BufferedInputStream(is);

                ByteArrayBuffer baf = new ByteArrayBuffer(50);
                int current = 0;
                while ((current = bis.read()) != -1) {
                    baf.append((byte) current);
                }

                FileOutputStream fos = new FileOutputStream(file);
                fos.write(baf.toByteArray());
                fos.close();
                break;

            default:
                Log.e("Statuscode", "Unexpected status code: "
                        + responseGet.getStatusLine().getStatusCode());
                break;
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

Это работает для небольших документов.Но для документов, размер которых превышает несколько МБ, этот код вылетает с «OutOfMemoryException».Есть идеи?

Ответы [ 2 ]

1 голос
/ 04 января 2012

Вы сохраняете файл в памяти полностью, а затем записываете этот буферный файл в хранилище. Вместо этого пропустите буферизацию и запишите фрагменты в хранилище по мере их поступления.

FileOutputStream fos = new FileOutputStream(file);
while ((current = bis.read()) != -1) {
    fos.write(current);
}
fos.close();

примечание ... не разработчик Android, так что не знаю, сработает ли это на самом деле, так что рассматривайте это как псевдокод.

0 голосов
/ 04 января 2012

Вы просто пытаетесь прочитать весь файл в память, а вашей JVM недостаточно памяти.Вы, вероятно, хотите записать файл внутри цикла while, а не добавлять его в буфер.

...