web-dev-qa-db-ja.com

Closeableを実装するか、AutoCloseableを実装します

私はJavaを学習していますが、implements Closeableおよびimplements AutoCloseableインターフェースに関する適切な説明が見つかりません。

interface Closeableを実装すると、Eclipse IDEがメソッドpublic void close() throws IOExceptionを作成しました。

インターフェイスなしでpw.close();を使用してストリームを閉じることができます。しかし、インターフェースを使用してtheclose()メソッドを実装する方法を理解できません。そして、このインターフェースの目的は何ですか?

また、知りたいのですが、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 {


}
110
malas

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

jVMはclose()を自動的に呼び出します。

Closeable は古いインターフェースです。 何らかの理由で 下位互換性を維持するために、言語設計者は別の言語を作成することにしました。これにより、すべてのCloseableクラス(IOExceptionをスローするストリームなど)をtry-with-resourcesで使用できるだけでなく、close()からより一般的なチェック済み例外をスローすることもできます。

疑わしい場合は、AutoCloseableを使用してください。クラスのユーザーは感謝します。

166

CloseableAutoCloseableを拡張し、IOストリーム専用です:例外の代わりにIOExceptionをスローし、dem等です。一方、AutoCloseableはこの保証を提供しません。

これはすべて、両方のインターフェースのjavadocで説明されています。

AutoCloseable(またはCloseable)を実装すると、クラスをJava 7で導入されたtry-with-resourcesコンストラクトのリソースとして使用できます。これにより、ブロックの終わりでそのようなリソースを自動的に閉じることができます。リソースを明示的に閉じるfinallyブロックを追加します。

クラスはクローズ可能なリソースを表していないため、このインターフェイスを実装する意味はまったくありません。IOTestをクローズすることはできません。インスタンスメソッドがないため、インスタンス化することもできません。インターフェイスを実装するということは、クラスとインターフェイスの間にis-aの関係があることを意味することを忘れないでください。ここにはそのような関係はありません。

66
JB Nizet

ここに小さな例があります

public class TryWithResource {

    public static void main(String[] args) {
        try (TestMe r = new TestMe()) {
            r.generalTest();
        } catch(Exception e) {
            System.out.println("From Exception Block");
        } 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 ");
    }
}

出力は次のとおりです。

GeneralTest 
From Close -  AutoCloseable  
From Final Block
7
Lova Chittumuri

try-with-resourcesステートメント。

try-with-resources statementは、1つ以上のリソースを宣言する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キーワードの直後の括弧内に表示されます。 Java SE 7以降のクラスBufferedReaderは、インターフェースJava.lang.AutoCloseableを実装します。 BufferedReaderインスタンスはtry-with-resourceステートメントで宣言されているため、tryステートメントが正常に終了するか、突然終了するか(メソッドBufferedReader.readLineIOExceptionをスローした結果)に関係なく閉じられます。

Java SE 7より前のバージョンでは、finallyブロックを使用して、tryステートメントが正常に完了したか突然終了したかに関係なく、リソースを確実に閉じることができます。次の例では、try-with-resourcesステートメントの代わりにfinallyブロックを使用しています。

static String readFirstLineFromFileWithFinallyBlock(String path)
                                                     throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }

}

ドキュメントを参照 してください。

5
inderisonline

最近、私はJava SE 8 Programmer Guide ii Bookを読みました。

AutoCloseableCloseableの違いについて何かを見つけました。

AutoCloseableインターフェイスはJava 7で導入されました。それ以前は、Closeableという別のインターフェイスが存在していました。次の例外を除き、言語設計者が望んでいたものに似ていました。

  • Closeableは、スローされる例外のタイプをIOExceptionに制限します。
  • Closeableは、実装がべき等であることを要求します。

言語設計者は、後方互換性を強調しています。既存のインターフェースを変更することは望ましくないため、AutoCloseableという新しいインターフェースを作成しました。この新しいインターフェースは、Closeableよりも厳密ではありません。 CloseableAutoCloseableの要件を満たしているため、後者が導入されたときにAutoCloseableの実装を開始しました。

3
Arvind Katte