2016-05-24 1 views
-3

я знаю, что это может получить вниз голосование это беспокоит меня многопочему я когда-либо нужно использовать .close() на ресурсы

я уже прочитал все сообщения на .close() метод как

explain the close() method in Java in Layman's terms

Why do I need to call a close() or shutdown() method?

the usage of close() method(Java Beginner)

я эти вопросы, которые могут показаться слишком тривиальным

1.Что означает слово «ресурс» означает в точности (это файл или объект «FileWriter» или какой-либо другой предмет) (попытаться объяснить как можно шире)

давайте рассмотрим следующий код

import java.io.*; 
public class characterstreams 
{ 
    public static void main(String []args) throws Exception 
    { 
     File f=new File("thischaracter.txt"); 
     FileWriter fw=new FileWriter(f); 
     char[] ch={'a','c','d'}; 
     fw.write('a'); 
     fw.write(ch); 
     fw.write("aaaa aaaaa aaaaaaa"); 
     fw.flush(); 
     FileReader fr=new FileReader(f); 
     int r=fr.read(); 
     System.out.println(r); 
     char[] gh=new char[30]; 
     System.out.println(fr.read(gh)); 
    } 
} 

после компиляции и выполнения его

G: /> Java characterstreams

позволяет говорить ресурс FileWriter ниже (так как я до сих пор получить значение ресурсов)

JVM запускается и открывает так называемые ресурсы, а затем выполнение завершается, и после чего JVM прибудет выключается после выполнения

2.it разблокирует ресурс, который он открыл, так как это не работает прямо (поправьте меня, если я ошибаюсь)

G: />

в этой точке JVM является не работает

3.before shuting вниз, сборщик мусора называется правильно? (поправьте меня, если я ошибаюсь) так FileWriter объекты разрушаются , то почему мы должны закрыть все ресурсы, которые мы открыли

и

4.again Я прочитал, что «ресурсы просочились», что это должно означать ...?

+0

Вы думаете о небольшом, самодостаточном примере. Есть бесчисленные случаи, когда это не применимо. Что делать, если часть вашей программы остается в памяти бесконечно (например, потоки демона)? Или если он оставляет уязвимый ресурс файловой системы в несогласованном состоянии из-за того, что ваше приложение заканчивается «неправильно»? И т.д. И т. Д. – Mena

+0

@Mena, что означает ресурс, точно означает ... я рискнул проголосовать, поэтому попробуйте и объясните мне ... – viru

+0

Ресурс предоставляется ОС (доступ к дискам, сокеты ...) – mvera

ответ

3

resource означает все, что требуется JVM и/или операционной системе, чтобы предоставить вам требуемую функциональность.

Взял ваш пример. Если вы открываете FileWriter операционную систему в целом (зависит от операционной системы, файловой системы и т. Д.) Будет делать (если вы хотите, чтобы записать файл на диск, как HDD/SDD)

  1. создать запись каталога для запрашиваемого файла
  2. создать структуру данных для поддержания процесса записи в файл
  3. выделить дисковое пространство, если вы на самом деле записать данные в файл

(примечание: это не исчерпывающий список)

Дело будет сделано для любого файла, открыть для записи. Если вы не закрываете resource, все это остается в памяти и по-прежнему поддерживается операционной системой.

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

Найдите небольшую демонстрацию на Linux.

public static void main(String[] args) throws IOException { 
    List<OutputStream> files = new ArrayList<>(); 
    for (int i = 0; i < 1000; i++) { 
     files.add(Files.newOutputStream(Paths.get("/tmp/demo." + i), 
       StandardOpenOption.CREATE)); 
    } 
} 

Код открытого одноэтажного файла для записи.

Предположим, ваш предел открытых файлов 1024

ulimit -n 
1024 

запустить фрагмент кода, и она будет генерировать 1000 файлов /tmp/demo.*.

Если предел открытых файлов только 100 код потерпит неудачу

ulimit -n 100 
java.nio.file.FileSystemException: /tmp/demo.94: Too many open files 

(он не до того, как сама JVM имеет несколько открытых файлов)

Для предотвращения таких проблем (нехватка ресурсов) вам следует закрыть файлы, которые вам больше не нужно писать. Если вы не делаете этого в Java (close()), операционная система также не знает, может ли память и т. Д. Быть освобождена и использована для другого запроса.

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