![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Leos239 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 26.11.2006 Репутация: нет Всего: нет |
Добрый день!
Я новичок в Java и у меня следующая проблема: работает некоторая программа и пишет xml-подобный файл, например: <calcalation name="calc1" energy="239.1" iternum="7" /> <calcalation name="calc2" energy="239.0" iternum="109" /> <calcalation name="calc3" energy="239.14" iternum="34" /> ........................................................................................... мне надо прочитать и обработать этот файл другой программой, однако, если поступать так:
то вылетает исключение "The markup in the document following the root element must be well-formed" что вполне правомочно, ибо корневого элемента нет; Как я понимаю, следут передавать правильный xml-файл или поток с xml для метода builder.parse(), т.е. <calculations> <calcalation name="calc1" energy="239.1" iternum="7" /> <calcalation name="calc2" energy="239.0" iternum="109" /> <calcalation name="calc3" energy="239.14" iternum="34" /> ........................................................................................... </calculations> если бы я писал программу на Delphi, то я бы сделал бы примерно так: создал объект класса TMemomyStream, записал бы туда "<calculations>" + содержимое файла + "</calculations>" и передал бы этот поток для парсинга; в метод builder.parse() надо обязательно передать потомка класса InputStream, но я не могу записать в InputStream строчки для корня "<calculations>" и "</calculations>" (и вообще ничего не могу туда записать); Можно, конечно, создать временный файл вместо потока в памяти, но может быть есть более нормальное решение? может есть какой-нибудь стандартный класс, который реализует интерфейсы InputStream и OuputStream? |
|||
|
||||
v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
я так понимаю тебе постоянно надо добавлять по одной строчке... вычитывать , парсить и заново записывать действительно не совсем экономично.
В Ява есть класс RandomAccessFile позволяет писать, читать из указаного места в файле. Попробуй воспользоваться им. |
|||
|
||||
Kangaroo |
|
|||
![]() AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 21 Всего: 104 |
Сделай наследника от инпутстрима, который будет вставлять calculations вначале и вконце. Хотя способ v2v легче. -------------------- Lost.... |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Самый простой способ - использовать StringReader и StringWriter - аналоги TMemoryStream из Delphi. Но правильнее создать наследика InputStream или Reader, как советует Kangaroo. А что советует делать v2v, а не понимаю.
|
|||
|
||||
Leos239 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 26.11.2006 Репутация: нет Всего: нет |
нет, мне надо читать этот "xml-файл" редко и пол секунды на его распарсивание можно пережить;
так в этом и вопрос как сделать такого наследника: этот наследник должен быть наследником InputStream (чтобы его можно было передать в builder.parse) и OutputStream (чтобы в него можно было записывать); как сказал, я новичок в Java и не до конца понимаю как написать такой класс; может есть готовое решение??
в том-то и дело, что не аналоги - каждый из них умеет либо только читать либо только писать, и TMemoryStream может и то и то; тем более что StringReader не является потомком от InputStream, поэтому его нельзя использовать в builder.parse() Это сообщение отредактировал(а) Leos239 - 16.2.2009, 16:12 |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
StringWriter записывает, после записи получаешь String, передаёшь её конструктору StringReader, который передаёшь парсеру.
Можно использовать SequenceInputStream:
|
|||
|
||||
Leos239 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 26.11.2006 Репутация: нет Всего: нет |
math64, спасибо!
SequenceInputStream работает! а через StringReader нельзя, т.к. для builder.parse() нужет потомок InputStream, а StringReader потомок от Reader; |
|||
|
||||
v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 8 Всего: 56 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |