Проблемы с чтением огромного файла размером 12 МБ (java.lang.OutOfMemoryError) - PullRequest
3 голосов
/ 12 декабря 2011

Мне нужно открыть файл размером 12 Мегабайт, но на самом деле я делаю это, создавая буфер размером 12834566 байт, потому что размер файла составляет 12 МБ, и я разрабатываю это приложение для мобильных систем Android.

Затем, я полагаю, мне нужно читать с блоками по 1024 Кбайт вместо одного блока по 12 Мбайт с символом for, но я не знаю, как это сделать, мне нужна небольшая помощь.

Это мой фактический код:

File f = new File(getCacheDir()+"/berlin.mp3");
        if (!f.exists()) try {
          InputStream is = getAssets().open("berlin.mp3");
          int size = is.available();
          byte[] buffer = new byte[size];
          is.read(buffer);
          is.close();
          FileOutputStream fos = new FileOutputStream(f);
          fos.write(buffer);
          fos.close();
        } catch (Exception e) { throw new RuntimeException(e); }

Пожалуйста, кто-нибудь может сказать мне, что я должен изменить в этом коде, чтобы читать блоки размером 1024 КБ вместо одного блока по 12 МБ?

спасибо!

Ответы [ 3 ]

4 голосов
/ 12 декабря 2011

Попробуйте скопировать 1 КБ за раз.

File f = new File(getCacheDir()+"/berlin.mp3");
if (!f.exists()) try {
     byte[] buffer = new byte[1024];
     InputStream is = getAssets().open("berlin.mp3");
     FileOutputStream fos = new FileOutputStream(f);
     int len;
     while((len = is.read(buffer)) > 0) 
        fos.write(buffer, 0, len);
} catch (Exception e) { 
     throw new RuntimeException(e); 
} finally {
     IOUtils.close(is); // utility to close the stream properly.
     IOUtils.close(fos);
}

Поддерживает ли Android символические или ручные ссылки, такие как UNIX?Если это произойдет, это будет быстрее / эффективнее.

1 голос
/ 12 декабря 2011
File f = new File(getCacheDir()+"/berlin.mp3");
InputStream is = null;
FileOutputStream fos = null;
if (!f.exists()) try {
    is = getAssets().open("berlin.mp3");
    fos = new FileOutputStream(f);
    byte[] buffer = new byte[1024];
    while (is.read(buffer) > 0) {
        fos.write(buffer);
    }
} catch (Exception e) { 
    throw new RuntimeException(e); 
} finally { 
    // proper stream closing
    if (is != null) {
        try { is.close(); } catch (Exception ignored) {} finally {
           if (fos != null) {
               try { fos.close(); } catch (Exception ignored2) {}
           }
        }
    }
}
0 голосов
/ 12 декабря 2011
        import org.apache.commons.fileupload.util.Streams;

        InputStream in = getAssets().open("berlin.mp3");
        OutputStream out = new FileOutputStream(f);
        Streams.copy(in, out, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...