SAXBuilder (). Build (InputStream) - это считывает весь файл в память? - PullRequest
0 голосов
/ 04 июня 2018

Читая документы, этот метод используется во всех примерах, которые я видел:

(версия org.jdom.input.SAXBuilder - jdom-1.1.jar)

Document doc = new SAXBuilder().build(is);
Element root = doc.getRootElement();
Element child = root.getChild("someChildElement");
...

, где is является InputStream переменной.

Мне интересно, так как это построитель SAX (в отличие от построителя DOM), весь поток ввода будет считан в объект документа с помощью метода сборки?Или это работает из-за ленивой нагрузки и до тех пор, пока я запрашиваю элементы с Element.getChildren() или аналогичными функциями (вытекающими из корневого узла), которые предназначены только для пересылки по документу, сборщик автоматически берет на себя загрузку фрагментов потокадля меня?

Мне нужно убедиться, что я не загружаю весь файл в память.

Спасибо, Майк

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Анализатор DOM, аналогично анализатору JDom, загружает весь ресурс XML в память, чтобы предоставить вам экземпляр Document, позволяющий перемещаться по элементам XML.
Некоторые ссылки здесь :

Стандарт DOM является кодифицированным стандартом для модели документа в памяти.

И здесь :

JDOM работает с логическим деревом XML в памяти,

И DOM, и JDom используют синтаксический анализатор SAX для чтения ресурса XML, но используют его только для хранения всего содержимого в экземпляре Documentчто они возвращаются.Действительно, с Dom и JDom клиенту никогда не нужно предоставлять обработчик для перехвата событий, запускаемых синтаксическим анализатором SAX.

Обратите внимание, что и DOM, и JDom не обязаны использовать SAX для внутреннего использования.
Они используют их главным образом, поскольку стандарт SAX уже существует, и поэтому имеет смысл использовать его для сообщения об ошибках.


Мне нужно убедиться, что я не загружаю весь файл в память.

У вас есть две модели программирования для работыс XML: потоковая передача и объектная модель документа (DOM).
Вы ищете первый.

Поэтому используйте синтаксический анализатор SAX , предоставив свой обработчик для обработки событий, генерируемых синтаксическим анализатором SAX (startDocument(), startElement() и т. Д.) Или в качестве альтернативы взгляните на более пользователядружественный API: STAX (потоковый API для XML):

Как API в семействе JAXP, StAX можно сравнить среди других API с SAX, TrAX и JDOM, Из последних двух StAX не такой мощный и гибкий, как TrAX или JDOM, но он также не требует столько памяти или загрузки процессора, чтобы быть полезным, и StAX во многих случаях может превзойти API на основе DOM s.Те же самые аргументы, изложенные выше, сравнивая затраты и выгоды модели DOM с моделью потоковой передачи, применимы здесь.

0 голосов
/ 04 июня 2018

Он с готовностью анализирует весь файл для построения представления в памяти (т. Е. Document) файла XML.

Если вы хотите быть в этом абсолютно уверены, вы можете просмотреть исходный код наGitHub.Еще важнее следующие классы: SAXBuilder, SAXHandler и Document.

...