новый PrintWriter(новый BufferedWriter(новый FileWriter(output.txt, true))) не печатает

Я хочу, чтобы это записывалось в output.txt без его очистки - просто добавлялось в конец. Однако, когда я использую следующие два метода:

public void addEmails(ArrayList<String> emails){
    for (int i = 0; i < emails.size(); i++){
        System.out.println(emails.get(i));
        writer.println(emails.get(i));

        if (i == emails.size() - 1){
            System.out.println();
            System.out.println();
            writer.println();
            writer.println();
        }
    }

}

public void addFileName(String fn){
    String fileName = fn.replace("%DATE%.%FORMAT%", "");
    writer.println(fileName);
    writer.println();
    System.out.println(fileName);
    System.out.println();
}

Они вызываются из следующих методов:

public void analyze(String path){

     try {  
            System.out.println(path);



         File inputFile = new File(path);
         InputStream inputStream= new FileInputStream(inputFile);
         Reader reader = new InputStreamReader(inputStream,"UTF-8");

         InputSource is = new InputSource(reader);
         is.setEncoding("UTF-8");




         SAXParserFactory factory = SAXParserFactory.newInstance();
         SAXParser saxParser = factory.newSAXParser();
         DescriptorHandler descHandler = new DescriptorHandler(this);
         saxParser.parse(is, descHandler);  
         reader.close();
         writer.close();
      } catch (Exception e) {
         e.printStackTrace();
      }



}

Saxparser.parse использует следующие перегруженные методы для DefaultHandler:

@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    // if (qName.equalsIgnoreCase("student")) {
    // String rollNo = attributes.getValue("rollno");
    // System.out.println("Roll No : " + rollNo);
    if (qName.equalsIgnoreCase("DestinationGroup")) {
        bDestinationGroup = true;
    } else if (qName.equalsIgnoreCase("EmailDestination")) {
        bEmailDestination = true;
    } else if (qName.equalsIgnoreCase("Filename")) {
        bFileName = true;
    }

}

@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {
    if (qName.equalsIgnoreCase("DestinationGroup")) {

        descriptorAnalyzer.addFileName(filename);

        descriptorAnalyzer.addEmails(emails);

        emails.clear();


        bDestinationGroup = false;
    }
}

@Override
public void characters(char ch[], int start, int length)
        throws SAXException {


    if (bEmailDestination) {
        String s = new String(ch, start, length);
        emails.add(s);
        bEmailDestination = false;
    }

    else if (bFileName) {
        filename = new String(ch, start, length);
        bFileName = false;
    }

}

Объявление (вызывается при запуске программы):

    writer = new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true)));

System.out.println() делает именно то, что я хочу. Однако файл output.txt остается без изменений.

Редактировать: теперь он записывает в файл, но вместо того, чтобы добавлять его, он очищает его и записывает снова.

Изменить еще раз: я неправильно понял. После еще нескольких тестов он записывает в файл только при первом вызове analysis(). При последующих вызовах он ничего не делает.

Редактировать 3: проблема решена, но с использованием flush() вместо close(), поэтому принтер не закрывается. Я считаю, что закрытие принтрайтера вызвало сбой при последующей записи.


person Daniel Paczuski Bak    schedule 22.07.2015    source источник
comment
Вам нужно закрыть потоки/писатели, когда они сделали свою работу. Также я не вижу, где вы вызываете свой метод addEmails.   -  person Pshemo    schedule 22.07.2015
comment
Я вызываю их в другом месте, где я генерирую строки. System.out.println() печатает правильные вещи, поэтому проблемы быть не может. Я попробую ваше решение.   -  person Daniel Paczuski Bak    schedule 22.07.2015
comment
Я сделал то, что вы сказали, но теперь он не добавляется в конец файла - он сбрасывает его. Обновление главного.   -  person Daniel Paczuski Bak    schedule 22.07.2015
comment
Я не могу вам помочь, не увидев код, который позволит воспроизвести вашу проблему.   -  person Pshemo    schedule 22.07.2015
comment
Можете ли вы добавить определение переменной writer?   -  person Some guy    schedule 22.07.2015
comment
Добавил все это дело. Извините, взял немного.   -  person Daniel Paczuski Bak    schedule 22.07.2015


Ответы (2)


BufferedWritter не записывает данные в файл каждый раз, когда вы используете println. Весь смысл в том, чтобы сохранить его в буфере, а затем, когда буфер будет заполнен, он запишет. Проблемы возникают, когда вы никогда не достигаете максимального размера буфера и не вызываете сброс на вашем устройстве записи. То же самое для BufferedOutputStream.

Таким образом, вы должны вызвать write.flush() перед его закрытием.

person Monads are like...    schedule 22.07.2015

Я написал простой класс со следующим основным методом

public class Test {
    public static void main(String[] args) {
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new BufferedWriter(new FileWriter("output.txt", true)));
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.println("Hello World!");
        writer.close();
    }
}

Этот код не добавлялся к файлу output.txt, пока я не добавил метод writer.close() после завершения записи в файл. В качестве альтернативы у меня также сработало добавление вызова writer.flush() (без вызова close()). Может быть, вы можете попробовать добавить вызов writer.flush() после того, как закончите писать.

person Some guy    schedule 22.07.2015