2014-11-11 4 views
5

Я прочитал этот вопрос Using flush() before close(), и принятый ответ - это только означает, что вы следуете шаблону.Нужно ли нам сначала называть flush() перед закрытием()?

Так же, как BufferedWriter#close() или FilterOutputStream.#close(), если все забуференном поток/Writer будет вызывать его flush(), когда мы называем close() и если мы (DEV и Дев, который будет рассматривать код), все знают, что мы действительно все еще нужно это? Если да, в чем причина?

+0

IMO, вы этого не делаете, но это не значит, что это хорошая идея :-) если вы переключитесь с реализации Writer или OutputStream, вы можете прекратить неожиданное поведение, если не очистите те, которые в этом нуждаются. Вы можете утверждать, что наличие бесполезного флеша() - плохой дизайн JVM, тогда мой ответ «возможно» :-) Еще одна вещь, которую мы можем исследовать, - это обратная совместимость, если предыдущие версии JVM также хорошо работают без промывать(). – Leo

+0

Что именно вы спрашиваете, на что не связано вопрос, на который вы ссылаетесь? – jarnbjo

+0

@jarnbjo, мне просто нужно знать, является ли это всего лишь незанятым произведением, что это явно следует за правилом? – Jaskey

ответ

2

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

Немногие эксперты знают наизусть джавадок. Я бы точно не знал, будет ли поток покраснеть или нет, не глядя, , и я, вероятно, не одинок. Увидев явный вызов flush(), это совершенно ясно, и, следовательно, делает код более удобным для чтения.

Кроме того, имя метода close() ничего не говорит о промывке. Это от интерфейса Closeable, и, естественно, ничего не говорится о промывке. Если вы не очищаете буферный выходной поток перед закрытием, , несмотря на то, что он хочет сбросить его, вы будете полагаться на предположения, которые могут быть или не быть правдой. Это ослабит вашу реализацию.

Любые сделанные вами предположения, вам следует каким-то образом перейти к будущим сопровождающим. Один из способов сделать это, оставив комментарий:

// no need to flush() manually, close() will do it automatically 

Если вы не оставить этот комментарий, будущее Сопровождающие может иметь для поиска в Javadoc тоже если, как я, они не» запомните. Но тогда, зачем вы пишете такой комментарий, когда проще и лучше просто называть это сейчас и делать с ним.

Короче говоря, сначала промывка перед закрытием просто правильная логика. Нет необходимости в предположениях и предположениях, и не нужно заставлять читателей думать.

+0

Еще две вещи, которые должны быть понятны.1. Только для буферизованного потока требуется flush() перед закрытием() 2. Каждый поток в java. io не будет иметь никакого побочного эффекта, если я закрою() без flush(). Это правильно? – Jaskey

+0

1. Да, промывка - это понятие, специфичное для буферизованного выхода. См. Также [Flushable] (https://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html) 2. В 'java.io' имеется довольно много потоков. Я должен пройти через все, чтобы проверить, и я просто не вижу смысла в этом. С другой стороны, я добавил еще одну причину флеша, см. Мой обновленный ответ. – janos

-1

Для вывода важно, чтобы мы вызывали flush() и close(), потому что буферизованные данные могли быть потеряны, что объясняется первым ответом here. Если выход вашей программы невелик, и ваш писатель быстро закончит работу, это не будет иметь большого значения для закрытия() и flush() в моем опыте.

Для ввода не имеет значения, если мы не вызываем close() до выхода системы.

+0

Но ' close() 'уже flush для нас, так что это мой вопрос, почему мы должны рушить вручную прямо перед тем, как закрыть() – Jaskey

+0

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

+1

проверьте здесь http://stackoverflow.com/questions/9858495/using-flush-before-close – Jaskey