2015-10-23 2 views
-1

фономЧтение через файл с буферизацией чтение

Я пишу XML-конвертер, который принимает входные данные из текстовых файлов и переводит их в XML. В текстовом файле каждая запись представлена ​​линией, и каждое поле представлено вкладкой между ними. Таким образом, в текстовом файле две записи будут выглядеть следующим образом:

fieldA  fieldB  fieldC 
fieldA  fieldB  fieldC 

Проблема

Я загрузки текстового файла в BufferedReader и с помощью StAX реализации Woodstox для создания XML. Я вижу, что получаю правильные данные из моего метода getColumnValue. Но почему-то WoodStox записывает первую запись снова и снова, вместо того, чтобы принимать данные, которые доставляются каждый раз через цикл while. Так как я знаю входы (от getColumnValue) приходят правильно, я могу только сделать вывод, что проблема заключается в Вудстоке, но до сих пор я не был в состоянии понять, почему ...

Код:

while ((strRead = buffer.readLine()) != null) { 

    String recordInputs[] = strRead.split("\t"); 
    writer.writeStartElement("Record"); 

    writer.writeStartElement("FIELDA"); 
    writer.writeCharacters(getColumnValue("BSTYPE", tableColumns, recordInputs)); 
    writer.writeEndElement(); 

    writer.writeStartElement("FIELDB"); 
    writer.writeCharacters(getColumnValue("BSDDT", tableColumns, recordInputs)); 
    writer.writeEndElement(); 

    writer.writeStartElement("FIELDC"); 
    writer.writeCharacters(getColumnValue("BSACTIVE", tableColumns, recordInputs)); 
    writer.writeEndElement(); 

    writer.writeEndElement(); 
} 

writer.writeEndElement(); 
writer.writeEndDocument(); 

writer.flush(); 
writer.close(); 
+1

Не знаю, что делает 'getColumnValue()', но почему бы просто не сделать 'writer.writeCharacters (recordInputs [0])'? – Andreas

+0

getColumnValue() возвращает строку. Он возвращает правильную строку для каждой итерации цикла while. Поэтому я знаю, что getColumnValue() не там, где проблема. – user2725919

+0

Кажется, что не проблема с кодом, который вы опубликовали, поэтому вы должны включить код для метода 'getColumnValue'.Я согласен с @Andreas в том, что неясно, какое значение может иметь этот метод, когда вы можете просто напрямую обращаться к элементам вашего массива 'recordInputs'. – VGR

ответ

0

Я так и не нашел хорошего ответа, почему это не сработало, но мне удалось это исправить.

неработающий:

writer.writeCharacters(getColumnValue("BSTYPE", tableColumns, customer)); 

Рабочие:

String bsType = getColumnValue("BSTYPE", tableColumns, customer); 
writer.writeCharacters(csType); 

Как я уже говорил ранее getColumnValue() возвращает строку, так что я понятия не имею, почему это изменение устраняет проблему, но она делает.

0

Поскольку вы не предоставили Minimal, Complete, and Verifiable example, вот оно:

String input = "1\t2\t3\r\n" + 
       "4\t5\t6\r\n"; 
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out); 
System.out.println(writer.getClass()); 
writer.writeStartDocument(); 
writer.writeStartElement("Root"); 
try (BufferedReader in = new BufferedReader(new StringReader(input))) { 
    for (String strRead; (strRead = in.readLine()) != null;) { 
     String recordInputs[] = strRead.split("\t"); 
     writer.writeStartElement("Record"); 

     writer.writeStartElement("FIELDA"); 
     writer.writeCharacters(recordInputs[0]); 
     writer.writeEndElement(); 

     writer.writeStartElement("FIELDB"); 
     writer.writeCharacters(recordInputs[1]); 
     writer.writeEndElement(); 

     writer.writeStartElement("FIELDC"); 
     writer.writeCharacters(recordInputs[2]); 
     writer.writeEndElement(); 

     writer.writeEndElement(); 
    } 
} 
writer.writeEndElement(); 
writer.writeEndDocument(); 
writer.flush(); // Don't close System.out 

При запуске на Java 8 без Woodstox, я получаю (отформатирован для удобства чтения):

class com.sun.xml.internal.stream.writers.XMLStreamWriterImpl 

<?xml version="1.0" ?> 
<Root> 
    <Record><FIELDA>1</FIELDA><FIELDB>2</FIELDB><FIELDC>3</FIELDC></Record> 
    <Record><FIELDA>4</FIELDA><FIELDB>5</FIELDB><FIELDC>6</FIELDC></Record> 
</Root> 

Как вы можете видеть, он использует встроенную реализацию Java, а значения хороши.

При запуске с woodstox-core-asl-4.2.0.jar и stax2-api-3.1.1.jar на пути к классам, я получаю (отформатирован для удобства чтения):

class com.ctc.wstx.sw.SimpleNsStreamWriter 

<?xml version='1.0' encoding='UTF-8'?> 
<Root> 
    <Record><FIELDA>1</FIELDA><FIELDB>2</FIELDB><FIELDC>3</FIELDC></Record> 
    <Record><FIELDA>4</FIELDA><FIELDB>5</FIELDB><FIELDC>6</FIELDC></Record> 
</Root> 

Как вы можете видеть, он использует реализацию Woodstox, и значения по-прежнему хорошо.

Поскольку вы не указали логику getColumnValue(), или проверяемый пример, или версию Woodstox, которую вы используете, мы ничего больше не можем вам помочь.

+0

Спасибо за попытку, но см. Мой ответ ниже или мой первоначальный вопрос, почему я не включил getColumnValue() ... – user2725919

Смежные вопросы