Java / Android Чтение большого текстового файла (~ 2,5 МБ)

1

Я пытаюсь прочитать в большом текстовом файле (~ 2,5 МБ) в своем приложении для Android, используя следующий код:

private static String readFile(String path) throws IOException {
  FileInputStream stream = new FileInputStream(new File(path));
  try {
      FileChannel fc = stream.getChannel();
      MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
      /* Instead of using default, pass in a decoder. */
      return Charset.defaultCharset().decode(bb).toString();
  }
  finally {
    stream.close();
  }
}

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

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


UPDATE:

Вот раздел, где я действительно прочитал файл:

try                 
{
    String str = readFile(filePath);
    et.setText(str);
    et.setSelection(str.length());
}
catch (Exception ex)
{
    et.setText("There was an error reading the file: " + filePath + "\nDetails: " + ex);
}

Где et - это AutoCompleteTextView


ОБНОВЛЕНИЕ 2:

Я запустил adb и нашел следующее:

04-11 15:26:16.805 20646 20658 W ActivityManager: Activity pause timeout for HistoryRecord{45b37620 com.ultimatecomputerservicesinc.androidhelloworld/.HelloWorld}
04-11 15:26:17.032 20727 20727 D dalvikvm: GC_EXTERNAL_ALLOC freed 1202 objects / 51792 bytes in 66ms
-- snip --
04-11 15:26:20.868 20727 20727 D dalvikvm: GC_EXTERNAL_ALLOC freed 639 objects / 25048 bytes in 38ms
04-11 15:26:20.961 25842 25842 I Process : Sending signal. PID: 25842 SIG: 9
04-11 15:26:21.102 20727 20727 D dalvikvm: GC_EXTERNAL_ALLOC freed 626 objects / 24328 bytes in 93ms
04-11 15:26:21.141 20646 20650 I ActivityManager: Process com.ultimatecomputerservicesinc.androidhelloworld (pid 25842) has died.

Что означает сигнал 9?


ОБНОВЛЕНИЕ 3

Мои подозрения верны, у меня кончилось память! Как увеличить размер JVM на Android?

04-12 20:41:48.905  6610  6610 E AndroidRuntime: FATAL EXCEPTION: main
04-12 20:41:48.905  6610  6610 E AndroidRuntime: java.lang.OutOfMemoryError
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.text.PackedIntVector.growBuffer(PackedIntVector.java:257)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.text.PackedIntVector.insertAt(PackedIntVector.java:187)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.text.DynamicLayout.reflow(DynamicLayout.java:336)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.text.DynamicLayout.<init>(DynamicLayout.java:150)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.widget.TextView.makeNewLayout(TextView.java:4987)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.widget.TextView.checkForRelayout(TextView.java:5484)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.widget.TextView.setText(TextView.java:2776)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.widget.TextView.setText(TextView.java:2644)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.widget.EditText.setText(EditText.java:75)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.widget.TextView.setText(TextView.java:2619)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at com.ultimatecomputerservicesinc.androidhelloworld.HelloWorld$1$1.run(HelloWorld.java:183)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.os.Handler.handleCallback(Handler.java:587)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:92)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:143)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:4701)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at java.lang.reflect.Method.invokeNative(Native Method)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Method.java:521)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-12 20:41:48.905  6610  6610 E AndroidRuntime:    at dalvik.system.NativeStart.main(Native Method)
  • 0
    Я считаю, что сигнал 9 просто SIGKILL. Является ли процесс принудительным закрытием до того, как будет обнаружено исключение?
  • 0
    Я не могу понять! Все, что я знаю, это то, что он внезапно падает, но только с большим файлом ...
Показать ещё 3 комментария
Теги:
io
out-of-memory
nio

2 ответа

0
Лучший ответ

Пожалуйста, распечатайте данные об исключениях в журнале и опубликуйте результаты. Сделайте что-то вроде этого:

catch( Exception err) {

    Log.e("There was an error reading the file", err);
}

Это должно дать вам более содержательное сообщение, объясняющее, что произошло, а также след методов, которые выполнялись.

Затем мы можем помочь вам.

У меня были исключения из памяти, когда я разбирал файлы объемом 2,5 МБ с помощью парсера DOM... но я не думаю, что вы это сделаете, так что это может быть другой проблемой. Во всяком случае, я решил свою проблему, разделив данные на несколько файлов и разобрав их по одному. ~ 1 МБ был "безопасным" размером для файлов.

  • 0
    Где хранятся файлы журнала?
  • 0
    Вы должны использовать инструмент Android: LogCat. Чтобы запустить его, запустите консоль, перейдите в папку установки Android SDK, войдите в папку «tools» и выполните «adb logcat». Вы можете использовать DDMS, если предпочитаете графический интерфейс (он находится в той же папке). Я предпочитаю logcat. Также, если вы используете eclipse, в него интегрируется DDMS. Вы должны иметь это в представлении отладки или что-то. Ссылка: developer.android.com/guide/developing/tools/logcat.html developer.android.com/guide/developing/debugging/ddms.html
Показать ещё 12 комментариев
0

Ваше приложение на самом деле не поймает никаких исключений, оно просто очищает ресурсы, если оно сбой.

Добавьте catch (исключение e) {} в try/finally, чтобы поймать исключения.

У меня есть приложение, и я использовал для загрузки в 1 МБ файлы, что не было проблемой (хотя был парсер DOM)

  • 0
    Да, вне этой части файла я знаю, что делаю.
  • 0
    @Richard J. Ross IlL: Почему бы вам не взглянуть на logcat, чтобы увидеть информацию о сбоях? Отправьте это, чтобы проверить, что проблема - OutOfMemoryError. Вы запускаете его на устройстве или эмуляторе?
Показать ещё 14 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню