2014-11-11 20 views
5

Przeczytałem to pytanie Using flush() before close(), a zaakceptowana odpowiedź oznacza, że ​​podążasz za wzorcem.Czy naprawdę musimy wywołać flush() tuż przed close() dzisiaj?

Podobnie jak BufferedWriter#close() lub FilterOutputStream.#close(), jeśli wszystkie buforowanej Stream/Writer wezwie jej flush() kiedy nazywamy close() i jeśli my (dev i dev, który dokona przeglądu kodu) wszyscy wiemy, że mamy naprawdę nadal potrzebują to? Jeśli tak, jaki będzie powód?

+0

IMO, nie, ale to nie znaczy, że to dobry pomysł :-) po przełączeniu z Writer bądź OutputStream wdrożenia, może skończyć posiadające nieoczekiwane zachowanie, jeśli nie wylewać te, które jej potrzebują. Możesz argumentować, że posiadanie jakiegoś bezużytecznego koloru() to zły projekt JVM, wtedy moja odpowiedź brzmi "może" :-) Kolejną rzeczą, którą możemy zbadać, jest kompatybilność wsteczna, jeśli poprzednie wersje JVM działają również bez spłukać(). – Leo

+0

O co dokładnie pytasz, co nie jest objęte pytaniem, z którym się łączysz? – jarnbjo

+0

@jarnbjo, Po prostu muszę wiedzieć, czy jest to tylko nieaktywny exec pracy, który jest tylko ściśle przestrzegać zasady? – Jaskey

Odpowiedz

2

Jak mówi javadoc, nie musisz potrzebować, aby się spłukać. Ale nadal dobrze jest robić, biorąc pod uwagę swoich czytelników i zdrowy rozsądek.

Niewielu ekspertów zna javadoc na pamięć. Nie wiem na pewno, czy strumień zostanie przepłukany, czy nie, bez sprawdzania go, i prawdopodobnie nie jestem sam. Zobacz wyraźne wywołanie flush() czyni to doskonale jasne, , a zatem sprawia, że ​​kod jest łatwiejszy do odczytania.

Ponadto nazwa metody close() oznacza nic o spłukiwania. To z interfejsu Closeable, i oczywiście nic nie mówi o spuszczaniu wody. Jeśli nie wylewać buforowany strumień wyjściowy przed zamknięciem, mimo chcąc go opróżnić, będziesz opierając się na założeniach, które mogą lub nie mogą być prawdziwe. Osłabiłoby to wdrożenie.

Wszelkie założenia można zrobić, trzeba jakoś przekazać przyszłych opiekunów. Jednym ze sposobów na to jest za pozostawienie komentarza:

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

Jeśli ten komentarz nie opuszczają, przyszli opiekunowie mogą mieć do wyszukiwania Javadoc też jeśli tak jak ja don” Zapamiętaj to. Ale dlaczego miałbyś pisać taki komentarz, kiedy łatwiej i lepiej po prostu nazwać to teraz sobą i skończyć z tym.

W skrócie, zaczerwienienie pierwszy przed zamknięciem jest po prostu dobrą logiki. Nie ma potrzeby przyjmowania założeń i drugiej domysły, i nie musisz myśleć o swoich czytelnikach.

+0

Jeszcze dwie rzeczy do wyczyszczenia.1. Tylko buforowany strumień wymaga flush() przed close() 2.Every stream in java. Io nie wywoła żadnych skutków ubocznych, jeśli zamknę() bez spłukiwania(). Czy to jest poprawne? – Jaskey

+0

1. Tak, płukanie jest pojęciem specyficznym dla buforowanego wyjścia. Zobacz także [Flushable] (https://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html) 2. Istnieje sporo strumieni w 'java.io'. Musiałbym przejść przez wszystkie z nich, aby zweryfikować, i po prostu nie widzę sensu w tym. Z drugiej strony, dodałem jeszcze jeden powód, by spłukać, zobaczyć moją zaktualizowaną odpowiedź. – janos

-1

Dla wyjścia ważne jest, abyśmy wywoływali flush() i close(), ponieważ buforowane dane mogą zostać utracone, jak wyjaśniono pierwszą odpowiedzią here. Jeśli wynik twojego programu jest niewielki, a pisarz kończy szybko, nie ma to większego znaczenia dla close() i flush() na moim doświadczeniu.

Dla wejścia, to nie będzie miało znaczenia, jeśli nie nazywamy close() przed zakończeniem instalacji.

+0

Ale " close() 'już nam odpowiada, więc to jest moje pytanie, dlaczego musimy spłukiwać ręcznie tuż przed zamknięciem() – Jaskey

+0

Nigdy wcześniej nie musiałem tego robić, nie jestem pewien dlaczego. –

+1

Sprawdź tutaj http://stackoverflow.com/questions/9858495/using-flush-before-close – Jaskey