орудия закрываемые или орудия Автоклавируемые



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



когда я реализовал interface Closeable, мой Eclipse IDE создал метод 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 {


}
438   6  

6 ответов:

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

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

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

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 это можно сделать более элегантно (см. ответ).

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 res here
}

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

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

Closeable выходит AutoCloseable, и специально посвящен потокам ввода-вывода: он бросает IOException вместо Exception и является идемпотентным, тогда как AutoCloseable не дает этой гарантии.

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

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

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

вот небольшой пример

public class TryWithResource {

    public static void main(String[] args) {
        try (TestMe r = new TestMe()) {
            r.generalTest();
        } 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 ");
    }
}

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

The try-with-resources statement - это try оператор, который объявляет один или несколько ресурсов. А 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();
    }

}

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

недавно я прочитал книгу Java SE 8 Programmer Guide ii.

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

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

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

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

Comments

    Ничего не найдено.