2013-09-02 5 views
2

У меня есть следующий код:Bufferedwriter работает, но файл пуст?

CSVmaker(LinkedList data) { 
    String [] myLines = makeStrings(data); 
    // for (int k = 0; k<myLines.length; k++) 
    // System.out.println(myLines[]); 




    this.file = new File("rawdata.csv"); 
     try { 
      BufferedWriter buff = new BufferedWriter(new FileWriter(file)); 
      for (int i = 0; i<myLines.length; i++){ 
       buff.write(myLines[i]); 
       buff.newLine(); 
       System.out.println("done"); 
      } 
     } catch (IOException ex) { 
      System.out.println("except"); 
     } 



} 

Нет, я проверил на содержание myLines, они являются правильными.

Кроме того, я получаю отпечаток, который печатает «сделано» так же часто, как и следовало бы. Создается csv.

Однако, если я открываю его вручную, он пуст.

В чем причина этого?

+2

Вам не нужно использовать 'buff.close()'? – DevZer0

+1

Весь смысл буфера заключается в буфере данных, пока он не будет заполнен, или вы не скажете, что хотите написать. Вы не сбросили() или не закрыли() поток, чтобы данные никогда не покидали буфер. –

+0

Возможный дубликат [BufferedWriter не будет записывать все данные в файл] (http://stackoverflow.com/questions/11660116/bufferedwriter-wont-write-all-of-the-data-to-a-file) – Val

ответ

11

Вы никогда не очищаете буфер или не закрываете BufferedWriter.

После того, как цикл, сделать следующие вызовы:

buff.flush(); 
buff.close(); 

Даже с другими ресурсами, закрытие их, когда сделано это хорошая идея.

+4

Закрытие должно быть действительно сделанный в блоке finally, потому что дескриптор файла должен быть закрыт, даже если в цикле происходит какое-либо исключение. Если используется Java 7, предпочтительнее использовать оператор try-with-resources. –

+0

@JBNizet Да, я прост для ясности для OP. – hexafraction

+0

Ничего себе, 2 правильных ответа после моего принятия всего 10 минут душ. Как я полагаю, я не могу голосовать за 2, я просто проголосую за то, кто был первым, если все в порядке. Еще не удалось вставить наконец-то - если я получу «не могу найти переменный бафф» – newnewbie

4

У вас должно быть close() поток после использования.
Звоните buff.close() после записи цикла; BufferedWriter закроет данные в файл при закрытии.

0

Хотя на вопрос ответит. Я хотел бы добавить, как работает буфер.

всякий раз, когда вы пытаетесь записать файл в буфер, все, что вы пишете, добавляется в буфер. Когда буфер заполнен, содержимое записывается в файл. Таким образом мы уменьшаем количество обращений к жесткому диску, тем самым повышая эффективность.

Если мы хотим принудительно записать файл без заполнения буфера, мы используем метод flush().