Android: разобрать большую часть данных - PullRequest
0 голосов
/ 03 февраля 2011

Я играю с Android и пытаюсь получить файл (PDF-книга). Для этого я написал Servelt, который кодирует книгу в строку base64 и помещает ее в документ XML. Этот документ содержит также имя, автора и поля IBSN. Я успешно получил это. В случае маленькой книги я могу даже расшифровать ее и открыть. Но если размер больше 2 МБ, я получаю OutOfMeoryError. Мой код парсера:

public void characters(char[] ch, int start, int length)
        throws SAXException {

    if(builder==null) builder = new StringBuilder();
        builder.append(new String(ch, start, length));

Затем я делаю следующее:

fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString()+"/book.pdf", false);
            byte[] toWrite = Base64.decode(builder.toString(), Base64.DEFAULT);
            fos.write(toWrite);
            fos.flush();
            fos.close();

Кто-нибудь знает, как я могу разобрать это без ошибки? Я пытался разобрать это в символьный метод (я имею в виду использование небольшого буфера), но он терпит неудачу ... Недопустимая строка base 64.

1 Ответ

1 голос
/ 03 февраля 2011

Кто-нибудь знает, как я могу разобрать это без ошибки?

Скорее всего, вы не можете, так как вам не хватает оперативной памяти для работы.

Разумные программисты не будут преобразовывать большой двоичный файл в «строку base64 и помещать ее в документ XML».Разумные программисты:

  • помещают метаданные (имя, автора, ISBN) в поля свойств в PDF, что является хорошим решением для Java, но может быть проблемой для Android, поскольку библиотеки длядобраться до этих полей может или не может работать (например, iText);или
  • загрузить два файла по отдельности (один с XML-метаданными, который содержит URL-адрес файла PDF);или
  • упакуйте PDF и XML-файл в один архив (например, ZIP) и загрузите архив

Могут быть и другие решения, кроме этих трех, но они должны дать вамотправная точка.

...