Хорошо, будет ли ByteArrayOutputStream вызывать переполнение памяти, если оно не будет правильно закрываться и закрываться? Я имею в виду, они должны быть помещены в код или Java будет мусор-собирать его?
Java. Является ли ByteArrayOutputStream безопасным без flush() и close()?
Ответ 1
Нет, он получит сбор мусора, как только последняя ссылка на него будет потеряна.
В javadoc:
Закрытие ByteArrayOutputStream не влияет. Методы в этом класс можно вызвать после того, как поток был закрыт без генерируя исключение IOException.
Кроме того, если вы посмотрите на код, то flush
и close
не являются op-операциями в классе ByteArrayOutputStream
(хотя flush
наследуется от OutputStream
, это не работает в OutputStream
если не переопределено в конкретной реализации).
Ответ 2
Да. Безопасно не flush()
или нет close()
a ByteArrayOutputStream
. и это не имеет значения для использования памяти, делаете ли вы это или нет.
Единственный случай, когда close()
или flush()
делают что-либо в связи с ByteArrayOuputStream
, это если вы использовали его в конце выходного конвейера, который включает компонент буферизации; например BufferedWriter
. Затем вам нужно сбросить или закрыть... с "вершины" конвейера... чтобы убедиться, что все данные попадают в байтовый массив.
GC не имеет смысла для вызова flush()
или close()
. В любом случае, содержимое потока будет оставаться в памяти до тех пор, пока объект остается достижимым. (Напротив, потоки чтения/записи для внешних ресурсов должны быть своевременно закрыты, поскольку они имеют внешний "дескриптор ресурса", который необходимо освободить...)
В итоге:
- Это не вредит
flush()
илиclose()
голомуByteArrayOutputStream
. Это просто не нужно. - Часто необходимо закрыть конвейер вывода, который заканчивается на
ByteArrayOutputStream
, но это не из-за использования памяти или соображений GC. - Память используется (как минимум) до тех пор, пока объект
ByteArrayOutputStream
доступен.
Ответ 3
Если вы посмотрите на источник ByteArrayOutputStream, вы увидите, что метод close
и flush
является noop, что означает, что они действительно ничего не делают. Тем не менее, я бы порекомендовал называть их, поскольку возможно, что реализация может измениться, хотя поведение метода close
явно указано в Javadoc.
Во-вторых, сборка мусора не имеет никакого отношения ни к одному из этих методов. Существует несколько различных реализаций (подсчет ссылок - один), но в целом, когда ссылок на экземпляр объекта больше нет, будет собран мусор.