[Java] Unterschied zwischen Closeable und AutoCloseable

AutoCloseable-Schnittstelle


package java.lang;

/**
 * An object that may hold resources (such as file or socket handles)
 * until it is closed. The {@link #close()} method of an {@code AutoCloseable}
 * object is called automatically when exiting a {@code
 * try}-with-resources block for which the object has been declared in
 * the resource specification header. This construction ensures prompt
 * release, avoiding resource exhaustion exceptions and errors that
 * may otherwise occur.
 *
 * @apiNote
 * <p>It is possible, and in fact common, for a base class to
 * implement AutoCloseable even though not all of its subclasses or
 * instances will hold releasable resources.  For code that must operate
 * in complete generality, or when it is known that the {@code AutoCloseable}
 * instance requires resource release, it is recommended to use {@code
 * try}-with-resources constructions. However, when using facilities such as
 * {@link java.util.stream.Stream} that support both I/O-based and
 * non-I/O-based forms, {@code try}-with-resources blocks are in
 * general unnecessary when using non-I/O-based forms.
 *
 * @author Josh Bloch
 * @since 1.7
 */
public interface AutoCloseable {
    /**
     * Closes this resource, relinquishing any underlying resources.
     * This method is invoked automatically on objects managed by the
     * {@code try}-with-resources statement.
     *
     * <p>While this interface method is declared to throw {@code
     * Exception}, implementers are <em>strongly</em> encouraged to
     * declare concrete implementations of the {@code close} method to
     * throw more specific exceptions, or to throw no exception at all
     * if the close operation cannot fail.
     *
     * <p> Cases where the close operation may fail require careful
     * attention by implementers. It is strongly advised to relinquish
     * the underlying resources and to internally <em>mark</em> the
     * resource as closed, prior to throwing the exception. The {@code
     * close} method is unlikely to be invoked more than once and so
     * this ensures that the resources are released in a timely manner.
     * Furthermore it reduces problems that could arise when the resource
     * wraps, or is wrapped, by another resource.
     *
     * <p><em>Implementers of this interface are also strongly advised
     * to not have the {@code close} method throw {@link
     * InterruptedException}.</em>
     *
     * This exception interacts with a thread's interrupted status,
     * and runtime misbehavior is likely to occur if an {@code
     * InterruptedException} is {@linkplain Throwable#addSuppressed
     * suppressed}.
     *
     * More generally, if it would cause problems for an
     * exception to be suppressed, the {@code AutoCloseable.close}
     * method should not throw it.
     *
     * <p>Note that unlike the {@link java.io.Closeable#close close}
     * method of {@link java.io.Closeable}, this {@code close} method
     * is <em>not</em> required to be idempotent.  In other words,
     * calling this {@code close} method more than once may have some
     * visible side effect, unlike {@code Closeable.close} which is
     * required to have no effect if called more than once.
     *
     * However, implementers of this interface are strongly encouraged
     * to make their {@code close} methods idempotent.
     *
     * @throws Exception if this resource cannot be closed
     */
    void close() throws Exception;
}


Schließbare Schnittstelle

package java.io;

import java.io.IOException;

/**
 * A {@code Closeable} is a source or destination of data that can be closed.
 * The close method is invoked to release resources that the object is
 * holding (such as open files).
 *
 * @since 1.5
 */
public interface Closeable extends AutoCloseable {

    /**
     * Closes this stream and releases any system resources associated
     * with it. If the stream is already closed then invoking this
     * method has no effect.
     *
     * <p> As noted in {@link AutoCloseable#close()}, cases where the
     * close may fail require careful attention. It is strongly advised
     * to relinquish the underlying resources and to internally
     * <em>mark</em> the {@code Closeable} as closed, prior to throwing
     * the {@code IOException}.
     *
     * @throws IOException if an I/O error occurs
     */
    public void close() throws IOException;
}


Anwendungsbeispiel

import java.io.Closeable;
import java.io.IOException;

class AutoCloseableSample implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("AutoClosable");
    }
}

class CloseableSample implements Closeable {
    @Override
    public void close() throws IOException {
        System.out.println("Closable");
    }
}

public class ExceptionSample {
    public static void main(String[] args) {
        try (CloseableSample closeableSample = new CloseableSample();  // IOException
              AutoCloseable autoCloseable = new AutoCloseableSample()   // Exception
        ) {
        } catch (IOException e) {} 
          catch (Exception e) {}
    }
}

Ausgabe

Es wird in umgekehrter Reihenfolge beim Öffnen mit try-with-resource geschlossen.

AutoClosable
Closable

Recommended Posts

[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen == und gleich
[JAVA] Unterschied zwischen Abstract und Interface
[Java] Unterschied zwischen Array und ArrayList
[Java] Unterschied zwischen StringBuffer und StringBuilder
[Java] Unterschied zwischen Länge, Länge () und Größe ()
Unterschied zwischen final und Immutable in Java
[Für Anfänger] Unterschied zwischen Java und Kotlin
Unterschied zwischen int und Integer in Java
Unterschied zwischen vh und%
[Java] Verstehe den Unterschied zwischen List und Set
Unterschied zwischen next () und nextLine () in Java Scanner
[Java] Unterschied zwischen "endgültiger Variable" und "unveränderlichem Objekt"
Unterschied zwischen Produkt und Variante
Unterschied zwischen redirect_to und render
Unterschied zwischen redirect_to und render
Unterschied zwischen CUI und GUI
Unterschied zwischen Variablen und Instanzvariablen
Unterschied zwischen Mockito-Core und Mockito-All
Unterschied zwischen Klasse und Instanz
Unterschied zwischen Bundle und Bundle-Installation
Unterschied zwischen ArrayList und LinkedList
Unterschied zwischen render und redirect_to
Unterschied zwischen List und ArrayList
Java Generics T und? Unterschied
Unterschied zwischen .bashrc und .bash_profile
Unterschied zwischen StringBuilder und StringBuffer
Unterschied zwischen render und redirect_to
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
[Java-Anfänger] Unterschied zwischen Länge und Länge () ~ Ich weiß nicht ~
[Ruby] Unterschied zwischen get und post
Unterschied zwischen Instanzmethode und Klassenmethode
Unterschied zwischen Schnittstelle und abstrakter Klasse
Unterschied zwischen == Operator und Methode gleich
Unterschiede zwischen "Anfänger" Java und Kotlin
[Terminal] Unterschied zwischen irb und pry
JavaServlet: Unterschied zwischen executeQuery und executeUpdate
Unterschied zwischen dem Operator == und der Methode eqals
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Grober Unterschied zwischen RSpec und Minitest
[Rails] Unterschied zwischen find und find_by
Unterschied zwischen Instanzvariable und Klassenvariable
[Java] Beziehung zwischen H2DB und JDBC
Unterschied zwischen Thymeleaf @RestController und @Controller
Unterschied zwischen Stream Map und FlatMap
[Java] Unterschied zwischen der Zuweisung der Basistypvariablen und der Zuordnung der Referenztypvariablen
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Unterschied zwischen primitivem Typ und Referenztyp
Unterschied zwischen string.getByte () und Hex.decodeHex (string.toCharaArray ())
Unterschiede zwischen Java und .NET Framework
[Java] Unterschied zwischen Stapelüberlauffehler und Speichermangel
Ist die Kurzschlussauswertung wirklich schnell? Unterschied zwischen && und & in Java
[Rails] Unterschied zwischen redirect_to und Rendern
[Android] Unterschied zwischen finish () und return;