Первый ответ: в Java нет такого понятия, как «уничтожение» (в смысле C ++). Есть только сборщик мусора, который может или не может проснуться и сделать свою работу, когда он видит объект, который готов для сбора. GC на Java, как правило, не заслуживает доверия.
Второй ответ: иногда да, иногда нет, но не стоит рисковать. От Эллиота Расти Гарольда Java IO :
Не все потоки должны быть закрыты - выходные потоки байтового массива не
нужно закрыть, например. Тем не менее, потоки, связанные с файлами
и сетевые соединения всегда должны быть закрыты, когда вы закончите с ними.
Например, если вы открываете файл для записи и не открываете его при
вы закончите, тогда другие процессы могут быть заблокированы от чтения или
запись в этот файл.
Согласно Гарольду, то же самое касается потоков ввода или вывода. Есть некоторые исключения (он отмечает System.in), но в целом вы рискуете, если не закроете файловые потоки, когда закончите. И закройте их в блоке finally, чтобы убедиться, что они закрываются, даже если выдается исключение.