StringBuilder - Метод Append прекращает функционировать в некой точке

Я утомлен с малышом projecto, graphipedia (он используется, чтобы иметь значение dumps wikipedia или какого-то другого wiki), и через этот я импортирую dump wikiquotes. Этот projecto использует внутри stax для parsear xml (а именно, dump)

В каком-то моменте процесса чтения xml, код читает символы (между и ), и код делает append в изменчивую переменную StringBuilder, но по какому-то разуму метод не добавляет даже единственного характера к переменной textBuffer (типа StringBuilder)

Здесь - код:

package org.graphipedia.dataimport;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;

import org.codehaus.stax2.XMLInputFactory2;

public abstract class SimpleStaxParser {

    private static final String STDIN_FILENAME = "-";
    private static final XMLInputFactory XML_INPUT_FACTORY = XMLInputFactory2.newInstance();

    private final List interestingElements;

    public SimpleStaxParser(List interestingElements) {
        this.interestingElements = interestingElements;
    }

    protected abstract void handleElement(String element, String value);

    public void parse(String fileName) throws IOException, XMLStreamException {
        if (STDIN_FILENAME.equals(fileName)) {
            parse(System.in);
        } else {
            parse(new FileInputStream(fileName));
        }
    }

    private void parse(InputStream inputStream) throws IOException, XMLStreamException {
        XMLStreamReader reader = XML_INPUT_FACTORY.createXMLStreamReader(inputStream, "UTF-8");
        try {
            parseElements(reader);
        } finally {
            reader.close();
            inputStream.close();
        }
    }

    private void parseElements(XMLStreamReader reader) throws XMLStreamException {
        LinkedList elementStack = new LinkedList();
        StringBuilder textBuffer = new StringBuilder();

        while (reader.hasNext()) {
            switch (reader.next()) {
            case XMLEvent.START_ELEMENT:
                elementStack.push(reader.getName().getLocalPart());
                textBuffer.setLength(0);
                break;
            case XMLEvent.END_ELEMENT:
                String element = elementStack.pop();
                if (isInteresting(element)) {
                    handleElement(element, textBuffer.toString().trim());
                }
                break;
            case XMLEvent.CHARACTERS:
                if (isInteresting(elementStack.peek())) {
                    textBuffer.append(reader.getText());
                }
                break;
            }
        }
    }

    private boolean isInteresting(String element) {
        return interestingElements.contains(element);
    }

}

Линия кода, который приносит мне проблемы, - эта

textBuffer.append(reader.getText());

В этой линии, reader.getText() возврати следующее:

lo que pasó, pasó por una razón...

'''Neo''': ¿Y qué razón es esa?

'''Smith''': Yo lo maté, señor Anderson, lo vi morir... Con cierta satisfacción, debo decir. Y luego algo pasó. Algo que sabía que era imposible, pero aún así pasó: usted me destruyó, señor Anderson... Después, cuando supe las reglas, entendí lo que debí haber hecho, pero no lo hice. No podía, fui obligado a quedarme, fui obligado a desobedecer... Y ahora aquí estoy por su culpa, señor Anderson. Por su culpa, ya no soy un agente de este sistema. Por su culpa cambié, me desconecté. Un hombre libre por decir algo, como usted, aparentemente libre.

'''Neo''': ¡Felicidades!

'''Smith''': Gracias... Pero, como sabrá, las apariencias engañan, lo cual me regresa a la razón por la que estoy aquí. No estamos aquí por ser libres. Estamos aquí por no ser libres. No hay razón de escapatoria, ni propósitos de negación. Porque, como sabemos, sin propósitos, no existiríamos...

'''Clones''': Propósito fue lo que nos creó... propósito lo que nos conecta, propósito lo que nos impulsa, lo que nos guía, lo que nos controla, es el propósito lo que define, propósito lo que nos une.

'''Smith''': Estamos aquí por culpa suya, señor Anderson. Estamos aquí para quitarle lo que trató de quitarnos a nosotros ¡Propósito!

[[Categoría:Películas]]

[[en:The Matrix (franchise)]]
[[sl:Matrica]]

Прежде чем метод append будьте выполнены, у переменной textBuffer есть стоимость в "count" 30643, "способность" 64254, и у text, который нужно добавлять, есть длина 1352.

Информация, в которой parser работает, - в: https://es.wikiquote.org / ватт / index.php? title=The_Matrix&action=edit (он очень большой, чтобы показывать ее прямо здесь)


Шаги, чтобы воспроизводить эту проблему: Получать dump, загружаться graphipedia, разжимать это и строить это с maven (mvn package). Corrrer ExtractLinks с Eclipse или сходный IDE, в команде мочь делать правильный debug кода.

3
задан 30.05.2016, 00:12
3 ответа

Это была моя ошибка, из-за незнания как Eclipse манипулируй, сделав debug, контент переменных типа String. Append добавлял контент в StringBuilder правильно, что он переместил, что, в такое длинное существо string, Eclipse он показывает нас до определенной степени и отсюда в больше образце "...".

Examinango стоимость переменной как будто он будет менять это, я смог видеть истинную стоимость переменной textBuffer.

Благодаря всем людям, которые помогли мне!

0
ответ дан 24.11.2019, 14:17

Мне кажется проблема находится в textBuffer.setLength(0);, когда parser инициализирует чтение tag, ты определяешь длину как 0 из контента StringBuilder. Удали эту линию и попытайся снова.

 switch (reader.next()) {
            case XMLEvent.START_ELEMENT:
                elementStack.push(reader.getName().getLocalPart());
                //textBuffer.setLength(0);
                break;

Пример setLength () , если у нас есть string с длиной 17

string = StackOverFlow.com
length = 17

, Если мы определяем StringBuilder с одним .setLength(5), такие obtendrГ-хозяева как результат:

string = Stack
length = 5
0
ответ дан 24.11.2019, 14:17
  • 1
    Большое спасибо Elenasys из-за твоей помощи, уже я смог находить каков это была проблема. –  chomp 30.05.2016, 00:03

Проблема - в вызове StringBuilder#setLength(0). Это будет отлаживать весь контент, который есть в StringBuilder. Ты можешь видеть это из-за cГіdigo использованный в AbstractStringBuilder (основанный на HotSpot v1.8.0_65):

public void setLength(int newLength) {
    //validación del valor ingresado
    if (newLength < 0)
        throw new StringIndexOutOfBoundsException(newLength);
    //asegura que haya espacio suficiente en la estructura (un arreglo)
    ensureCapacityInternal(newLength);
    //el resto de caracteres serán el caracter vacío: \0
    if (count < newLength) {
        Arrays.fill(value, count, newLength, '\0');
    }
    //se cambia la longitud como contenedor
    count = newLength;
}

Лучшее в этих случаях состоит в том, чтобы проверять, есть ли у переменной контент, заставлять что-то с этим контентом, и потом re инициализировать элемент:

case XMLEvent.START_ELEMENT:
    elementStack.push(reader.getName().getLocalPart());
    if (textBuffer.length() > 0) {
        //escribir los datos o lo que sea en algún lado
    }
    //textBuffer.setLength(0);
    //esto libera el contenido mejor que utilizando setLength a 0
    //ayuda al GC a retomar la memoria contenida por el objeto StringBuilder anterior
    textBuffer = new StringBuilder();
    break;
0
ответ дан 24.11.2019, 14:17
  • 1
    Привет Luiggi, я не думаю, что это проблема. Обрати внимание, что в последней части моего вопроса я довожу до сведения, что textBuffer он имеет сдержано, проблема состоит в том, что append был бы должен добавлять больше контент, но это не делает. Этот код, который ты вы говорите, выполняет один и #250; nica раз, когда находится START_ELEMENT. В случае, о котором я упоминаю, он нашел элемент text, поэтому инициализировал переменную textBuffer с длиной в 0. –  chomp 29.05.2016, 23:11
  • 2
    @chomp мне кажется, что оно последует за чем-то как это: reader.next() читает и находит XMLEvent.START_ELEMENT и инициализирует переменную textBuffer, потом читает контент XML, потом читает XMLEvent.START_ELEMENT снова благодаря тому, что есть укрытый элемент и отлаживает контент textBuffer. Я рекомендую тебе реализовывать соответствующий debug на контенте твоего XML, чтобы видеть qu и # 233; вот то, за чем оно последует. Если бы StringBuilder#append действительно не удался, он, потому что не существует м и # 225; s память и бросаться и # 237; в один OutOfMemoryError, но эта не кажется твоим situaci и # 243; n. –   29.05.2016, 23:15
  • 3
    Luiggi, я делаю debug в этом же самом мгновении. Мой intenci и # 243; n он не состоял в том, чтобы говорить, что метод est и # 225; не удаваясь, я понимаю, что это что-то, что очень мало вероятное. Он удается, но не добавляет контент, который он получает, в этом особенном случае. В других случаях я это продолжаю и новый текст добавлен правильно в textBuffer. –  chomp 29.05.2016, 23:23
  • 4
    @chomp лучшее быть и # 237; к которому ты разместил точно цепь текста, который ты пробуешь добавить, и который он бил козырем бы. Быть и # 237; в подходящий, если tambi и # 233; n ты добавляешь informaci и # 243; n на платформе, которую ты используешь: versi и # 243; n Java, имени VM, операционной системы, versi и # 243; n, и т.д. –   29.05.2016, 23:47
  • 5
    Большое спасибо Luiggi из-за твоей помощи, уже я смог находить каков это была проблема. –  chomp 30.05.2016, 00:03