Нужно ли закрывать ресурс, если мы используем try-with-resource - PullRequest
0 голосов
/ 12 декабря 2018

Я использую блок try-with-resource в своем коде, интересно, есть ли необходимость закрывать ресурс в конце метода или не нужен?

try (S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
  BufferedReader br = new BufferedReader(new InputStreamReader(object.getObjectContent()));
  BufferedWriter bw = new BufferedWriter(new FileWriter(new File("output.txt")))){
  String line;

  while((line=br.readLine())!=null){
    bw.write(line);
    bw.newLine();
    bw.flush();
  }
}

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Нет, ты не.Давайте рассмотрим пример try-catch-finally и try-with-resource

Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}

Это ваш обычный try-catch-finally, в этом вы закрываете сканер в блоке finally.Теперь давайте взглянем на try-with-resource

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

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

0 голосов
/ 12 декабря 2018

Вам не нужно закрывать ресурсы, которые вы определили в предложении try.Но, учитывая ваш пример, у вас также есть это в теле попытки:

BufferedWriter bw = new BufferedWriter(new FileWriter(new File("output.txt"))))

, и ваш код не закрывает этот ресурс.И это неправильно (а сохранение дескрипторов файловой системы, скорее всего, является настоящей утечкой ресурсов).

Другими словами: вы, вероятно, хотите добавить bw к предложению try-with-resources, так что оно сидитвместе с определением S3Object object (см. здесь для примера).

0 голосов
/ 12 декабря 2018

Нет.

Оператор try-with-resources обеспечивает закрытие каждого ресурса в конце оператора.Любой объект, который реализует java.lang.AutoCloseable, который включает в себя все объекты, которые реализуют java.io.Closeable, может использоваться в качестве ресурса.

А если вы используете Java 6 или старше:

До Java SE 7 вы можете использовать блок finally, чтобы обеспечить закрытие ресурса независимо от того, завершается ли оператор try нормально или внезапно.

Обновление:

Вы можете объявить один или несколько ресурсов в операторе try-with-resources.

, как вы использовали в своем коде.

...