Получение InputStream от OMElement

Я попробовал следующий образец [1]; но так как мой OMElement слишком велик, (я конвертирую файл (800MB) как OMelementэто происходит из другого процесса) я сталкиваюсь со следующими проблемами,

  • Процесс выходит из памяти
  • Сериализация занимает много времени.

Кто-нибудь может указать мне правильное решение?

[1]

 BufferedReader in = null;
 ByteArrayOutputStream baos = null;
 InputStream is = null;
 try {

    baos = new ByteArrayOutputStream();
    fileContent.serialize(baos);

    is = new ByteArrayInputStream(baos.toByteArray());

    in = new BufferedReader(new InputStreamReader(is));

1 ответ

К сожалению, ваш вопрос не дает четкого описания фактической проблемы, которую вы пытаетесь решить. Вместо этого он описывает проблему, которая, по вашему мнению, является решением вашей проблемы. Поэтому я могу попытаться восстановить проблему только на основе комментариев, которые вы сделали в ответ на Иана Робертса.

Если моя интерпретация этих комментариев верна, то проблема заключается в следующем. У вас есть документ XML, который содержит элемент с длинной последовательностью символов, который структурирован в несколько строк:

<some_element>
line 1
line 2
line 3
...
line N
</some_element>

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

Предоставленный вами фрагмент кода показывает, что вы выбрали неверное направление, пытаясь решить эту проблему. Код сериализует OMElement представляющий some_element а затем создает InputStream/Reader из сериализованного выхода. Однако это также будет содержать начальный и конечный теги для some_elementчто не то, что вы хотите. Вместо этого вы заинтересованы только в содержании элемента. Если вы посмотрите на OMElement интерфейс, вы можете увидеть, что он на самом деле определяет метод, который возвращает этот контент как Reader, Это называется getTextAsStream и Javadoc объясняет, как использовать этот метод таким образом, чтобы использование памяти было O(1) вместо O(N).

Другие вопросы по тегам