Cóż, czy ByteArrayOutputStream spowoduje przepełnienie pamięci, jeśli nie zostanie poprawnie przepłukane i zamknięte? Chodzi mi o to, czy trzeba je umieścić w kodzie, czy Java go wyrzuci?Java - Czy ByteArrayOutputStream jest bezpieczny bez opróżniania() i zamykania()?
Odpowiedz
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) .
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
Ponadto, jak mówi @ tjg184, dobrze jest wejść w nawyk zamykania strumieni w ostatecznych blokach. –
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.
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.
- 1. Co to jest wątek ByteArrayOutputStream bezpieczny dla wątków?
- 2. Różnica między funkcją opróżniania i zamykania w przypadku mechanizmu tworzenia kopii w java
- 3. Czy ten wątek klasy Java jest bezpieczny?
- 4. Czy bezpieczny wątek SecureRandom jest bezpieczny?
- 5. Czy można zamknąć czytnik bez zamykania strumienia?
- 6. Czy wątek NSFileManager jest bezpieczny?
- 7. Czy wątek libuv jest bezpieczny?
- 8. Czy poniższy kod wątku inkrementującego jest bezpieczny w java?
- 9. Czy wątek console.writeline jest bezpieczny?
- 10. Czy wątek Joiner jest bezpieczny?
- 11. Czy JDK7 jest teraz bezpieczny?
- 12. Czy mój kod jest bezpieczny?
- 13. Szyny: Czy klejnot jest bezpieczny?
- 14. Czy wątek RNGCryptoServiceProvider.GetBytes jest bezpieczny?
- 15. Czy wątek CertificateFactory.getInstance ("x.509") jest bezpieczny?
- 16. Czy wątek java.util.Calendar jest bezpieczny czy nie?
- 17. Zamknij Skaner bez zamykania System.in
- 18. Czy C# "??" Czy wątek operatora jest bezpieczny?
- 19. Czy tworzenie nowego wątku ma efekt uboczny opróżniania pamięci podręcznej?
- 20. Czy putStrLn jest bezpieczny dla wątków?
- 21. FileOutputStream vs ByteArrayOutputStream
- 22. Jak długo bezpieczny, bezpieczny kanał TCP jest bezpieczny?
- 23. Czy wątek armadillo solve() jest bezpieczny?
- 24. Czy wątek TransactionTemplate i SimpleJdbcTemplate jest bezpieczny dla wątków?
- 25. Czy createTextNode jest całkowicie bezpieczny przed iniekcją HTML i XSS?
- 26. .NET - Czy wątek metody Queue.Enqueue jest bezpieczny?
- 27. Korzystanie z RESTful API - czy jest bezpieczny?
- 28. Czy istnieje sposób zamknięcia programu Writer bez zamykania strumienia bazowego?
- 29. Delegowanie problemu z konstruktorem - czy jest bezpieczny?
- 30. Czy ten kod jquery jest bezpieczny?
Również zauważyłem ten: http://stackoverflow.com/questions/2330569/closing-a-bytearrayputputstream-has-no-effect?rq=1 –