155

私は 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 {


}
4

6 に答える 6

217

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クラス (ストリームの throwing などIOException) を try-with-resources で使用できるようになるだけでなく、より一般的なチェック例外を からスローすることもできますclose()

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

于 2012-10-30T14:41:17.923 に答える
86

CloseableextendsAutoCloseableであり、具体的には IO ストリーム専用です:IOExceptionの代わりにスローしException、冪等ですが、AutoCloseableこの保証は提供しません。

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

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

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

于 2012-10-30T14:46:18.113 に答える
46

あなたはインターフェイスにあまり慣れていないようです。投稿したコードでは、実装する必要はありませんAutoCloseable

閉じる必要があるファイルやその他のリソースを処理する独自の を実装する必要がある(または実装する必要がある) だけCloseableです。AutoCloseablePrintWriter

実装では、 を呼び出すだけで十分pw.close()です。これは、finally ブロックで行う必要があります。

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 では、これをよりエレガントに行うことができます (この回答を参照してください)。

于 2012-10-30T14:45:03.480 に答える
7

The try-with-resources Statement.

The try-with-resources statement is a try statement that declares one or more resources. A resource is an object that must be closed after the program is finished with it. The try-with-resources statement ensures that each resource is closed at the end of the statement. Any object that implements java.lang.AutoCloseable, which includes all objects which implement java.io.Closeable, can be used as a resource.

The following example reads the first line from a file. It uses an instance of BufferedReader to read data from the file. BufferedReader is a resource that must be closed after the program is finished with it:

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

In this example, the resource declared in the try-with-resources statement is a BufferedReader. The declaration statement appears within parentheses immediately after the try keyword. The class BufferedReader, in Java SE 7 and later, implements the interface java.lang.AutoCloseable. Because the BufferedReader instance is declared in a try-with-resource statement, it will be closed regardless of whether the try statement completes normally or abruptly (as a result of the method BufferedReader.readLine throwing an IOException).

Prior to Java SE 7, you can use a finally block to ensure that a resource is closed regardless of whether the try statement completes normally or abruptly. The following example uses a finally block instead of a try-with-resources statement:

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

}

Please refer to the docs.

于 2017-05-09T11:22:27.327 に答える