Реализует Closeable или реализует AutoCloseable

Я занимаюсь изучением Java, и я не могу найти никакого объяснения в интерфейсах implements Closeable и implements AutoCloseable.

Когда я реализовал interface Closeable, моя среда Eclipse создала метод public void close() throws IOException.

Я могу закрыть поток, используя pw.close(); без интерфейса. Но я не могу понять, как я могу реализовать метод close(), используя интерфейс. И какова цель этого интерфейса?

Также я хотел бы знать: как я могу проверить, действительно ли закрыт IOstream?

Я использовал базовый код ниже

import java.io.*;

public class IOtest implements AutoCloseable {

public static void main(String[] args) throws IOException  {

    File file = new File("C:\\test.txt");
    PrintWriter pw = new PrintWriter(file);

    System.out.println("file has been created");

    pw.println("file has been created");

}

@Override
public void close() throws IOException {


}

Ответ 1

Мне кажется, что вы не очень знакомы с интерфейсами. В коде, который вы разместили, вам не нужно реализовывать AutoCloseable.

Вы должны (или должны) реализовать Closeable или AutoCloseable если собираетесь внедрить свой собственный PrintWriter, который обрабатывает файлы или любые другие ресурсы, которые необходимо закрыть.

В вашей реализации достаточно вызвать pw.close(). Вы должны сделать это в блоке finally:

PrintWriter pw = null;
try {
   File file = new File("C:\\test.txt");
   pw = new PrintWriter(file);
} catch (IOException e) {
   System.out.println("bad things happen");
} finally {
   if (pw != null) {
      try {
         pw.close();
      } catch (IOException e) {
      }
   }
}

Код выше относится к Java 6. В Java 7 это можно сделать более элегантно (см. Этот ответ).

Ответ 2

AutoCloseable (представлен в Java 7) позволяет использовать идиому try-with-resources:

public class MyResource implements AutoCloseable {

    public void close() throws Exception {
        System.out.println("Closing!");
    }

}

Теперь вы можете сказать:

try (MyResource res = new MyResource()) {
    // use resource here
}

и JVM автоматически вызовет close() для вас.

Closeable это старый интерфейс. По какой-то причине Чтобы сохранить обратную совместимость, разработчики языка решили создать отдельный. Это позволяет использовать не только все Closeable классы (например, потоки, Closeable IOException) в try-with-resources, но также позволяет генерировать более общие проверенные исключения из close().

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

Ответ 3

Closeable extends AutoCloseable и специально предназначен для потоков IO: он выдает исключение IOException вместо Exception и является idempotent, тогда как AutoCloseable не предоставляет эту гарантию.

Все это объясняется в javadoc обоих интерфейсов.

Реализация AutoCloseable (или Closeable) позволяет использовать класс как ресурс конструкции try-with-resources, представленной в Java 7, что позволяет автоматически закрывать такие ресурсы в конце блока, не добавляя окончательно который закрывает ресурс явно.

Ваш класс не представляет собой закрытый ресурс, и нет абсолютно никакого смысла в реализации этого интерфейса: IOTest не может быть закрыт. Невозможно даже создать экземпляр, поскольку он не имеет метода экземпляра. Помните, что реализация интерфейса означает, что существует связь is-a между классом и интерфейсом. Здесь нет таких отношений.

Ответ 4

Вот маленький пример

public class TryWithResource {

    public static void main(String[] args) {
        try (TestMe r = new TestMe()) {
            r.generalTest();
        } catch(Exception e) {
            System.out.println("From Exception Block");
        } finally {
            System.out.println("From Final Block");
        }
    }
}



public class TestMe implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println(" From Close -  AutoCloseable  ");
    }

    public void generalTest() {
        System.out.println(" GeneralTest ");
    }
}

Вот вывод:

GeneralTest 
From Close -  AutoCloseable  
From Final Block

Ответ 5

Заявление try-with-resources.

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

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

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

В этом примере ресурс, объявленный в заявлении try-with-resources, представляет собой BufferedReader. Оператор объявления появляется в круглых скобках сразу после ключевого слова try. Класс BufferedReader, в Java SE 7 и более поздних версиях, реализует интерфейс java.lang.AutoCloseable. Поскольку экземпляр BufferedReader объявлен в инструкции try-with-resource, он будет закрыт независимо от того, завершает ли оператор try нормально или внезапно (в результате метода BufferedReader.readLine выбрасывает IOException).

До Java SE 7 вы можете использовать блок finally, чтобы гарантировать, что ресурс закрыт, независимо от того, завершает ли оператор try нормально или внезапно. Следующий пример использует блок finally вместо оператора try-with-resources:

static String readFirstLineFromFileWithFinallyBlock(String path)
                                                     throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }

}

Пожалуйста, обратитесь к документам.

Ответ 6

Недавно я прочитал Руководство по программированию на Java SE 8 ii.

Я нашел кое-что о разнице между AutoCloseable и Closeable.

Интерфейс AutoCloseable был представлен в Java 7. До этого существовал другой интерфейс под названием Closeable. Это было похоже на то, что хотели дизайнеры языка, за следующими исключениями:

  • Closeable ограничивает тип исключения, генерируемый IOException.
  • Закрываемый требует, чтобы реализации были идемпотентными.

Разработчики языка подчеркивают обратную совместимость. Поскольку изменение существующего интерфейса было нежелательным, они создали новый интерфейс, который называется AutoCloseable. Этот новый интерфейс менее строг, чем Closeable. Поскольку Closeable соответствует требованиям для AutoCloseable, он начал внедрять AutoCloseable, когда последний был представлен.

Ответ 7

Сделайте 1 вещь! wite оконечное состояние консоли o/p явно внутри метода close. В другом классе попробуйте-с-ресурсом, т.е. создайте экземпляр вашего ресурса и поставьте внутри предложение try-with-resource. youou заметим, что после того, как выполнение ресурса будет автоматически закрыто! инструкция напечатана!