2014-04-19 11 views

Odpowiedz

7

Nie, otrzyma śmieci zebrane po utracie ostatniego odniesienia do niego.

Per na javadoc:

Zamknięcie ByteArrayOutputStream nie ma żadnego wpływu. Metody z tej klasy można wywołać po zamknięciu strumienia bez generowania wyjątku IOEx.

Ponadto, jeśli spojrzeć na kod, zarówno flush i close są no-ops w klasie ByteArrayOutputStream (choć flush jest dziedziczona z OutputStream, jest to nie-op w OutputStream chyba że zostaną zamienione w konkretnej implementacji) .

+0

Dzięki. Chcę tylko uzyskać potwierdzenie.Z powodu mojego kodu mocno polegam na ByteArrayOutputStream, więc obawiam się, że bez spłukiwania() lub close() właściwie spowoduje to przepełnienie pamięci w dalszym etapie. – lannyboy

+0

Ponadto, jak mówi @ tjg184, dobrze jest wejść w nawyk zamykania strumieni w ostatecznych blokach. –

1

Jeśli spojrzeć na źródła ByteArrayOutputStream, można zobaczyć, że close i metoda flush jest noop, co oznacza, że ​​tak naprawdę nic nie robić. Jednak nadal zalecałbym wywoływanie ich, ponieważ możliwe jest, że implementacja może się zmienić, chociaż zachowanie metody close jest wyraźnie określone w Javadoc.

Po drugie, wywóz śmieci nie ma nic wspólnego z żadną z tych metod. Istnieje kilka różnych implementacji (liczenie odwołań to jeden), ale ogólnie, gdy nie ma już żadnych odwołań do instancji obiektu, zostaną one zebrane.

+0

Dzięki. Teraz jest to bardziej przejrzyste. – lannyboy

+0

Nie jest możliwe, że implementacja może się zmienić, ponieważ zachowanie metody close() jest określone w Javadoc. – EJP

3

Tak. Bezpieczne jest, aby nie przepłukiwać ani nie zamykać urządzenia ByteArrayOutputStream. Nie ma znaczenia dla użycia pamięci.

Jedynymi przypadkami, w których close() lub flush() coś w związku z ByteArrayOuputStream jest, jeśli użyłeś go na końcu potoku wyjściowego, który zawiera składnik buforowania; na przykład a BufferedWriter. Następnie musisz do trzeba opróżnić lub zamknąć ... z "góry" potoku ... aby zapewnić, że wszystkie dane sprawiają, że do tablicy bajtów.

Nie ma żadnych konsekwencji GC dla wywoływania flush() lub close(). Tak czy inaczej, zawartość strumienia będzie nadal przechowywana w pamięci tak długo, jak długo obiekt pozostanie osiągalny. (W przeciwieństwie do strumieni odczytu/zapisu do zasobów zewnętrznych muszą być zamknięte w sposób terminowy, ponieważ mają one zewnętrznego „deskryptor zasobów”, który musi być uwolniony ...)

Podsumowując:

  • Nie zaszkodzi zamknąć gołą ByteArrayOutputStream. To po prostu niepotrzebne.
  • Często trzeba konieczne zamknąć potok wyjściowy, który kończy się ByteArrayOutputStream, ale nie jest to spowodowane użyciem pamięci lub względami GC.
Powiązane problemy