私は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 {
}
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
を使用してください。クラスのユーザーは感謝します。
Closeable
はAutoCloseable
を拡張し、IOストリーム専用です:例外の代わりにIOExceptionをスローし、dem等です。一方、AutoCloseableはこの保証を提供しません。
これはすべて、両方のインターフェースのjavadocで説明されています。
AutoCloseable(またはCloseable)を実装すると、クラスをJava 7で導入されたtry-with-resourcesコンストラクトのリソースとして使用できます。これにより、ブロックの終わりでそのようなリソースを自動的に閉じることができます。リソースを明示的に閉じるfinallyブロックを追加します。
クラスはクローズ可能なリソースを表していないため、このインターフェイスを実装する意味はまったくありません。IOTestをクローズすることはできません。インスタンスメソッドがないため、インスタンス化することもできません。インターフェイスを実装するということは、クラスとインターフェイスの間にis-aの関係があることを意味することを忘れないでください。ここにはそのような関係はありません。
ここに小さな例があります
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
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.readLine
がIOException
をスローした結果)に関係なく閉じられます。
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();
}
}
ドキュメントを参照 してください。
最近、私はJava SE 8 Programmer Guide ii Bookを読みました。
AutoCloseable
とCloseable
の違いについて何かを見つけました。
AutoCloseable
インターフェイスはJava 7で導入されました。それ以前は、Closeable
という別のインターフェイスが存在していました。次の例外を除き、言語設計者が望んでいたものに似ていました。
Closeable
は、スローされる例外のタイプをIOException
に制限します。Closeable
は、実装がべき等であることを要求します。言語設計者は、後方互換性を強調しています。既存のインターフェースを変更することは望ましくないため、AutoCloseable
という新しいインターフェースを作成しました。この新しいインターフェースは、Closeable
よりも厳密ではありません。 Closeable
はAutoCloseable
の要件を満たしているため、後者が導入されたときにAutoCloseable
の実装を開始しました。