[JAVA] Principes de base de l'instruction try-with-resources

introduction

-Affiche un exemple de description lorsque l'instruction try-with-resources est utilisée et lorsqu'elle n'est pas utilisée. · Fournit des liens vers des sites Web utiles pour comprendre la déclaration try-with-resources. -La déclaration try-with-resources peut être utilisée dans Java SE 7 ou version ultérieure. -Les classes que l'instruction try-with-resources peut utiliser sont limitées aux classes d'implémentation de l'interface AutoCloseable et de sa sous-interface Closeable.

Exemple de description d'instruction try-with-resources

Sans l'instruction 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";

        FileInputStream in = null;
        FileOutputStream out = null;

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

            //Copier des données
            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();
                }
            }
        }
    }
}

point

    1. Il existe un risque d'omission de libération de ressources car aucune erreur de compilation ne se produira même s'il n'y a pas de clause finally.
  1. Puisqu'il est nécessaire de pointer vers la même ressource à la fois dans la clause try et la clause finally, la variable est déclarée en dehors de try-catch-finally.
    1. L'imbrication de try-catch est requise car il existe une possibilité d'exception IOException lors de l'appel de la méthode close de la clause finally.

Lors de l'utilisation de l'instruction 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;

            //Copier des données
            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

point

    1. Fondamentalement, les ressources sont automatiquement libérées. [^ 1] [^ 1]: Modèle dans lequel les ressources ne sont pas libérées par try-with-resources
  1. La portée de la variable est limitée à la clause try.

    1. Les exceptions à la clôture sont essentiellement inutiles à considérer.

Site de référence

Instruction try-with-resources de la documentation Oracle Java SE TASK NOTES [Java] syntaxe try-with-resources try-catch-finally, try-with-resources et exceptions qui se sont produites

Au fait

Des classes telles que FileInputStream appellent se fermer dans la méthode finalize, il est donc difficile de remarquer (ou de se produire) le bogue des fuites de versions de ressources. Cependant, laisser l'ouverture au GC est inefficace et n'est pas une bonne pratique, alors utilisez try-with-resources.

FileInputStream.java


package java.io;

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


public
class FileInputStream extends InputStream
{

===========================réduction===========================

    /**
     * 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();
           }
        });
    }

===========================réduction===========================

    /**
     * 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

Principes de base de l'instruction try-with-resources
Bases de Ruby
[Rails] Introduction aux principes de base du dispositif
Surveillance Docker-expliquant les bases des bases-
[GCD] Principes de base de la classe DispatchQueue
Principes de base de l'utilisation des caractères (Java)
[Entraine toi! ] Exécution de l'instruction SQL
Instruction pratique de base de la programmation Java
Résumé des bases du langage Java
Instruction de base de la programmation Java Practice-Switch
Bases du branchement conditionnel et du retour
À propos des bases du développement Android
Les bases de SpringBoot + MyBatis + MySQL
Bases de Ruby ~ Revue de difficile à comprendre ~
Bases de Ruby 2 ~ Revue des points difficiles ~
[Introduction à Ruby] À propos du rôle de true et break in the while statement
[Challenge CircleCI from 0] Apprenez les bases de CircleCI
Comprendre les bases de l'enregistrement audio Android
Mémorandum du nouveau diplômé SES [Java basics]
[GCD] Principes de base de la programmation parallèle dans Swift
Maintenant, j'ai résumé les bases de RecyclerView
[# 1 Java] Principes de base de Java-Major avant d'étudier-
[jour: 5] J'ai résumé les bases de Java
Retour sur les bases de Java
Rails Bases de la création d'une nouvelle application