Если вы открываете поток, вы должны закрыть его. Код в вопросе не делает этого, он просто покидает предыдущие потоки и закрывает только самые последние, которые он создает.
Непонятно, почему эти переменные потока должны быть static
, а не локальными в receive
. Если бы они были локальными в receive
, вы могли бы использовать try-with-resources для их автоматической очистки:
public static void receive(){
try (
ByteArrayInputStream byteIn = new ByteArrayInputStream();
ObjectInputStream objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
) {
//do something
}
}
Они будут автоматически закрыты, когда управление выйдет из try
.
Если по какой-то причине у них есть , чтобы быть членами класса static
, просто закройте и отпустите каждый созданный вами элемент (но гораздо проще иметь ошибки в коде, что означает, что у него есть пути выполнения, которые не в состоянии сделать это).
// All done
objectIn.close();
objectIn = null;
byteIn.close();
byteIn = null;
Примечание: с этими тремя типами потоков вам может не потребоваться byteIn
в качестве отдельной переменной. Подробнее в ответах на этот вопрос .