2015-02-19 2 views
0

Я пытаюсь использовать BufferedWriter для переключения между записью на File и писать к String, но я никогда не использовал BufferedWriter писать ничего, кроме файла.Использование BufferedWriter писать в строку

Возьмите этот компилируемый код:

public static void main(String[] args) { 
    try (BufferedWriter fileWriter = new BufferedWriter(new FileWriter(new File("file.txt"))); 
      StringWriter sw = new StringWriter(); 
      BufferedWriter stringWriter = new BufferedWriter(sw)) { 

     LinkedList<Record> records = new LinkedList<>(); 
     records.add(new Record("name1", "text1", 20.4)); 
     records.add(new Record("name2", "text2", -78)); 
     records.add(new Record("name3", "text3", 11.56)); 
     records.add(new Record("name4", "text4", 56)); 
     records.add(new Record("name3", "text3", -44)); 

     for(Record record : records) { 
      BufferedWriter writer; 
      if(record.amount < 0) { 
       writer = stringWriter; // write to string if amount is less than zero 
      } else { 
       writer = fileWriter; // write to file if not 
      } 

      writer.append(record.name); 
      writer.append(","); 
      writer.append(record.text); 
      writer.append(","); 
      writer.append(String.valueOf(record.amount)); 
      writer.newLine(); 

     } 

     String less_than_zero_amounts = sw.toString(); 
     System.out.println("Less than zero:" + less_than_zero_amounts); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

static class Record { 
    String name; 
    String text; 
    double amount; 

    public Record(String name, String text, double amount) { 
     this.name = name; 
     this.text = text; 
     this.amount = amount; 
    } 

    public String getText() { 
     return text; 
    } 

    public String getName() { 
     return name; 
    } 

    public double getAmount() { 
     return amount; 
    } 
} 

Выход для файла (правильно)

name1,text1,20.4 
name3,text3,11.56 
name4,text4,56.0 

Но выход для программы не печатает StringWriter.

Понятно, что использование StringWriter и присвоение BufferedWriter было догадкой. В любом случае я могу переключить BufferedWriter на вывод в String, чтобы решить эту проблему.

ответ

2

Вам нужно вызвать «заподлицо()», чтобы очистить содержимое буфера вывода: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html#flush()

Хотя я должен добавить, что вместо выбора между объектами BufferedWriter, вы, вероятно, хотите, чтобы просто выбрать между Writer объекты ... у StringWriter есть собственный буфер, поэтому нет необходимости добавлять дополнительный слой BufferedWriter поверх него.

+0

Я попытался использовать 'Writer', но у него нет метода' newline() '. – ryvantage

2

В случае FileWriter, то примерочных с-ресурсами называет close() на BufferedWriter, распространяющейся в FileWriter и выравнивались все, что вы написали.

То же самое происходит с StringWriter, но это происходит после того, как вы попытались уничтожить его содержимое, которое в этот момент пуст. Вам необходимо, чтобы flush() соответствовал BufferedWriter, прежде чем звонить по телефону toString() на StringWriter.

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