[JAVA] Grundlagen der Try-with-Resources-Anweisung

Einführung

Ein Beschreibungsbeispiel wird angezeigt, wenn die Anweisung try-with-resources verwendet wird und wenn sie nicht verwendet wird. · Bietet Links zu nützlichen Websites, um die Try-with-Resources-Anweisung zu verstehen. -Die Try-with-Resources-Anweisung kann in Java SE 7 oder höher verwendet werden. -Die Klassen, die die Anweisung try-with-resources verwenden kann, sind auf die Implementierungsklassen der AutoCloseable-Schnittstelle und ihrer Closeable-Schnittstelle für die Unterschnittstelle beschränkt.

Beschreibung Beispiel einer Try-with-Resources-Anweisung

Ohne die Try-with-Resources-Anweisung

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class TryWithResources {
    public static void main(String[] args) {

        String inFilePath = "D:\\A.txt";
        String outFilePath = "D:\\C.txt";

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream(inFilePath);
            out = new FileOutputStream(outFilePath);
            int c;

            //Daten kopieren
            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Punkt

    1. Es besteht das Risiko, dass Ressourcen freigegeben werden, da kein Kompilierungsfehler auftritt, selbst wenn keine finally-Klausel vorhanden ist.
  1. Da sowohl in der try-Klausel als auch in der finally-Klausel auf dieselbe Ressource verwiesen werden muss, wird die Variable außerhalb von try-catch-finally deklariert.
    1. Das Verschachteln von try-catch ist erforderlich, da beim Aufrufen der close-Methode der finally-Klausel die Möglichkeit einer IOException besteht.

Bei Verwendung der Anweisung try-with-resources

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class TryWithResources {
    public static void main(String[] args) {

        String inFilePath = "D:\\A.txt";
        String outFilePath = "D:\\C.txt";

        try (FileInputStream in = new FileInputStream(inFilePath);
                FileOutputStream out = new FileOutputStream(outFilePath);) {
            int c;

            //Daten kopieren
            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Punkt

    1. Grundsätzlich werden Ressourcen automatisch freigegeben. [^ 1] [^ 1]: Muster, in dem Ressourcen nicht durch Try-with-Resources freigegeben werden
  1. Der Umfang der Variablen ist auf die try-Klausel beschränkt.

    1. Ausnahmen zum Abschluss sind grundsätzlich nicht zu berücksichtigen.

Referenzseite

Try-with-Resources-Anweisung zur Oracle Java SE-Dokumentation TASK NOTES [Java] Syntax zum Ausprobieren mit Ressourcen try-catch-finally, try-with-resources und aufgetretene Ausnahmen

Apropos

Klassen wie FileInputStream werden in der finalize-Methode geschlossen, sodass es schwierig ist, den Fehler von Ressourcenfreigabe-Lecks zu bemerken (oder zu passieren). Es ist jedoch ineffizient und keine gute Praxis, die Öffnung dem GC zu überlassen. Verwenden Sie daher Try-with-Resources.

FileInputStream.java


package java.io;

import java.nio.channels.FileChannel;
import sun.nio.ch.FileChannelImpl;


public
class FileInputStream extends InputStream
{

===========================Kürzung===========================

    /**
     * Closes this file input stream and releases any system resources
     * associated with the stream.
     *
     * <p> If this stream has an associated channel then the channel is closed
     * as well.
     *
     * @exception  IOException  if an I/O error occurs.
     *
     * @revised 1.4
     * @spec JSR-51
     */
    public void close() throws IOException {
        synchronized (closeLock) {
            if (closed) {
                return;
            }
            closed = true;
        }
        if (channel != null) {
           channel.close();
        }

        fd.closeAll(new Closeable() {
            public void close() throws IOException {
               close0();
           }
        });
    }

===========================Kürzung===========================

    /**
     * Ensures that the <code>close</code> method of this file input stream is
     * called when there are no more references to it.
     *
     * @exception  IOException  if an I/O error occurs.
     * @see        java.io.FileInputStream#close()
     */
    protected void finalize() throws IOException {
        if ((fd != null) &&  (fd != FileDescriptor.in)) {
            /* if fd is shared, the references in FileDescriptor
             * will ensure that finalizer is only called when
             * safe to do so. All references using the fd have
             * become unreachable. We can call close()
             */
            close();
        }
    }
}

Recommended Posts

Grundlagen der Try-with-Resources-Anweisung
Grundlagen von Ruby
[Rails] Einführung in die Grundlagen der Entwicklung
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
[GCD] Grundlagen der DispatchQueue-Klasse
Grundlagen der Zeichenoperation (Java)
[Trainieren! ] Ausführung der SQL-Anweisung
Grundlagen der Java-Programmierung Practice-for-Anweisung
Zusammenfassung der Grundlagen der Java-Sprache
Grundlagen der Java-Programmierung Practice-Switch-Anweisung
Grundlagen der bedingten Verzweigung und Rückkehr
Über die Grundlagen der Android-Entwicklung
Die Grundlagen von SpringBoot + MyBatis + MySQL
Grundlagen von Ruby ~ Rückblick auf schwer verständliche ~
Grundlagen von Ruby 2 ~ Rückblick auf schwer verständliche ~
[Einführung in Ruby] Über die Rolle von true und break in der while-Anweisung
[Herausforderung CircleCI von 0] Lernen Sie die Grundlagen von CircleCI
Verstehen Sie die Grundlagen von Android Audio Record
Memorandum des neuen Absolventen SES [Java-Grundlagen]
[GCD] Grundlagen der parallelen Programmierung in Swift
Jetzt habe ich die Grundlagen von RecyclerView zusammengefasst
[# 1 Java] Grundlagen der Java-Major-Prämisse vor dem Studium-
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Rückblick auf die Grundlagen von Java
Rails Grundlagen zum Erstellen einer neuen Anwendung