Переполнение буфера при возврате - но мой буфер еще не заполнен? - PullRequest
2 голосов
/ 24 мая 2011

Я реализую программу чтения синтаксиса как побочное выполнение домашнего задания и читаю XML-файл по одному символу за раз. Моя цель - взять код, с которым я прошел лабораторное задание, и улучшить структуру и дизайн.

У меня есть SyntaxReader, который наследуется от PushbackReader, который имеет некоторые дополнительные методы, такие как readAndExpect(char c), trimWhitespace() и readUntilChar(char c). Затем у меня есть XMLSyntaxReader, который наследуется от SyntaxReader и добавляет такие функции, как readAttribute() и readNode() (последний рекурсивен для детей в дереве ...).

Я просто взял рабочий код из моего лабораторного задания и вставил его в соответствующие места в этом подходе. Однако, когда я пытаюсь прочитать первого ребенка, я получаю IOException: Pushback buffer overflow, который я не могу понять.

Это начало моего файла XML:

<Biosfar namn="Liv">ar allt som fortplantar sig
    <Rike namn="Vaxter"> etc...

Я отлаживал и смотрел, как считыватели синтаксиса успешно читали до <R в начале дочернего тега. В этот момент XMLSyntaxReader подтверждает, что это дочерний тег, не читает два последних символа (R и < в указанном порядке) и вызывает readNode() для анализа дочернего узла. Исключение возникает, когда я пытаюсь прочитать <.

В отладчике я также проверил, что приватная переменная pos PushbackReader действительно установлена ​​на 0, но я не могу понять, почему. Я проанализировал полную строку текста - почему эти символы не учитываются?

Я бы опубликовал свой код, но он довольно длинный и работал так же, прежде чем я не уверен, что моя точная реализация актуальна. Если это так, укажите куда-нибудь, где я могу загрузить фрагменты, и я поделюсь всем кодом.

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Разве размер по умолчанию для буфера PushbackReader не равен только 1? Это вызвало бы эту проблему, когда вы нажимаете второй символ. Что произойдет, если вы увеличите размер буфера?

0 голосов
/ 11 февраля 2015

Я получил с этим это:

byte[] bytes = programaFonte.getBytes();

PushbackReader reader = new PushbackReader(new InputStreamReader(new ByteArrayInputStream(bytes)),bytes.length);
...