Java. Является ли ByteArrayOutputStream безопасным без flush() и close()?

Хорошо, будет ли ByteArrayOutputStream вызывать переполнение памяти, если оно не будет правильно закрываться и закрываться? Я имею в виду, они должны быть помещены в код или Java будет мусор-собирать его?

Ответ 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.

Во-вторых, сборка мусора не имеет никакого отношения ни к одному из этих методов. Существует несколько различных реализаций (подсчет ссылок - один), но в целом, когда ссылок на экземпляр объекта больше нет, будет собран мусор.