Получение 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).