орудия закрываемые или орудия Автоклавируемые
Я нахожусь в процессе изучения 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 {
}
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