Android лучший способ открыть большие файлы ~ 3-6 МБ - недостаточно памяти - PullRequest
0 голосов
/ 09 ноября 2010

У меня всегда ошибка памяти.

мой код был:

public static String openAssetFile(Context ctx) {
BufferedReader br=new BufferedReader(new InputStreamReader(ctx.getResources().openRawResource(R.raw.allx)));
StringBuilder text = new StringBuilder();
try {
    String line;

    while ((line = br.readLine()) != null) {
        text.append(line);
        text.append('\n');
    }
}
catch (IOException e) {
    Log.e("IOErr", "IOErr");
}

return text.toString();
}

это хорошо для маленьких файлов, но что я могу сделать, когда id хочет открыть больший файл?как 3-6 мб.

спасибо

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Решение зависит от того, для каких целей вы читаете такой длинный текст.Например, в моем случае я столкнулся с той же проблемой при чтении достаточно большого текста для отображения его в многострочном TextView.Я решил проблему разработки собственного класса, который реализует интерфейс CharSequence .Класс просто разбивал входной файл и читал его по частям.

1 голос
/ 09 ноября 2010

Сколько памяти использует остальная часть вашего приложения? Ваше приложение может использовать максимум 16 МБ (или более в зависимости от устройства), поэтому загрузка файла 3 МБ не должна давать вам нехватку памяти.

Сказав это, я вспоминаю, что существует ограничение на размер файлов, которые вы можете открыть, которые содержатся в пакете приложения (~ 2 МБ). Что вы можете сделать, так это разделить ваш файл на более мелкие файлы с ограничением, а затем использовать http://download.oracle.com/javase/1.4.2/docs/api/java/io/SequenceInputStream.html для чтения этих нескольких файлов, как если бы они были одним файлом.

Кроме того, найдите способ предварительной обработки и сжатия данных, чтобы вы не использовали слишком много памяти.

Ваш код выглядит очень неэффективно. Исходя из опыта написания подобного кода, я предполагаю, что для его запуска требуется около 20 секунд. Это создаст тонны мусора, и все эти операции займут время. Разве вы не можете просто прочитать все свои данные сразу, без обработки для каждой записи? например Вы можете предварительно обработать ваши данные, сериализовать их в объект, а затем просто снять сериализацию в вашем приложении.

Я работал над приложением, которое должно было загрузить файл словаря 3 МБ, и для меня было решено предварительно обработать его в нужную мне оптимизированную структуру данных (снизив требования к пространству до 0,5 МБ), сериализовать, а затем просто загрузить объект непосредственно при запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...