2015-08-02 3 views
2

При чтении начинающих книг на Java я прочитал, что поток всегда должен быть закрыт, как только он больше не требуется. Почему это так? Что не так, если оставить его открытым?Что не так, если оставить поток открытым?

Рассмотрим следующий пример:

import java.io.*; 
public class SOStreamTest { 

public static void main(String[] args){ 

    try{ 

     FileWriter writer = new FileWriter("Foo.txt"); 
     writer.write("hello foo!"); 
     //Writer.close();   <-!Line in Question --> 
     }catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
} 
} 

Как возникает ожидается предупреждающее сообщение, «утечку ресурсов:„писатель“никогда не закрывается.

ответ

2

С одной стороны, вы ожидаете, что ваше приложение закончится в нижней части основного, однако основной является обычным методом и может вызываться другим кодом, который продолжает работать.

Причина, по которой вам не нужны потоки, заключается в том, что они, как правило, связаны с ресурсом ОС, который намного более ограничен, чем память.

Сокеты становятся еще более неприятными, так как вы можете использовать ресурсы как для своей программы, так и для удаленного хоста.

+1

@Shahzeb Я действительно понимаю, как работает сборщик мусора ... – RamanSB

2

Знаете ли вы на своем ПК с Windows и пытаетесь удалить файл, но он используется другой программой? Это одна из причин, по которой вы всегда должны закрывать входные или выходные потоки файлов.

Другим примером для Linux на этот раз является то, что для каждого входного или выходного потока файлов требуется что-то, называемое дескриптором файла. Данная система linux позволит только определенное количество дескрипторов файлов, и если вы достигнете максимума, могут произойти плохие вещи.

Когда вы закрываете поток, дескриптор файла отпускается.

Другие потоки ввода и вывода могут вызывать подобные проблемы, например, если не удается закрыть сетевой поток, можно открыть соединение с другой машиной. Сделайте это несколько тысяч раз, и у вас закончится порты или убейте машину, к которой вы подключаетесь.

0

Одна из наиболее распространенных причин состоит в том, чтобы все было записано в выход.

Предоставление нашему приложению доступа для записи данных в файл может занять некоторое время. Поэтому, чтобы не запрашивать его каждый раз для написания одного байта, мы используем буфер, такой как BufferedWriter, в котором мы храним большую часть данных, а когда он заполнен, он будет автоматически запрашивать доступ к записи, записывать сохраненные данные и очищать буфер.

Но в ситуации, когда буфер не заполнен, и у нас нет больше данных для записи, нам нужно явно информировать буфер для записи данных в файл. Мы можем сделать это, вызвав его метод flush или вызвав метод close, который неявно вызовет flush. Без него наш файл не будет содержать часть, хранящуюся в настоящее время в буфере.

1

Важность закрытия ваших потоков может быть сведена к два одна главной точке s :

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

  • Кроме того, если вы не закрываете поток, оно будет сохранено в памяти, так как не было намеков на то, что сборщик мусора, который может быть удален, может быть удален.

Таким образом, путем закрытия потока вы используете разумно как системный ресурс и ваш процесс память пространства .

EDIT: Как указано в разделе комментариев ниже, что я говорил о сборке мусора является неправильно. Однако может случиться так, что поток может быть закрыт до того, как GC будет уничтожен, так как многие основные потоки (по крайней мере, на Java) включают вызов close() по их методам finalize(). См. Это SO thread на эту тему.

+0

Закрытие потока не выпускает ничего в GC. – EJP

Смежные вопросы