2015-10-31 6 views
0

В процессе обучения Java я нашел (и поспешно использовать в своем коде) следующий образец кода из JDK:Как Formatter работает с BufferedWriter без закрытия?

public Formatter(OutputStream os, String csn, Locale l) 
    throws UnsupportedEncodingException 
{ 
    this(l, new BufferedWriter(new OutputStreamWriter(os, csn))); 
} 

Он проходит вновь созданный BufferedWriter к other constructor со ссылкой на него в качестве Appendable интерфейса (так что не может быть дополнительно продувают или закрытым в Formatter реализации):

private Formatter(Locale l, Appendable a) { 
    this.a = a; 
    this.l = l; 
    this.zero = getZero(l); 
} 

После некоторого мышления и выкапывания BufferedWriter код, я не могу понять, как это может работать должным образом - от BufferedWriter код выглядит так, что он потеряет буферизованные данные, если не закрыт, когда это будет сделано. Метод Finalize, по-видимому, не используется. В классе Formatter есть куча других конструкторов, которые используют BufferedWriter аналогичным образом (в основном, обертывание выходных потоков и файлов). Итак, как работает промывка буфера в этом коде? Или это куча ошибок в JDK (что звучит для меня невероятно, так как это очень простая и старая функциональность)?

ответ

0

Фортетера является закрывающимся. Так же, как и выходные потоки, он, таким образом, должен быть закрыт пользователем форматера и закрытие закрывает защитный BufferedWriter (и завернута OutputStream, транзитивно):

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Formatter.java#Formatter.close%28%29

Это, таким образом, ответственность клиентского кода для закрытия Formatter, если он был создан с помощью OutputStream.

+0

Спасибо, теперь я понимаю. Мне показалось, что если мы сохранили ссылку только через интерфейс Appendable, то мы не сможем вызвать на нем функцию close(). Полностью забыл о экземпляре магии и возможности выбора типов. – vagran