Java のリソース#
- メモリリソース:オブジェクト、配列などが占有するメモリ空間
- 物理リソース:ファイルハンドル、データベース接続、ネットワーク接続など
- メモリと物理リソースの違い
- メモリリソースはJVMによって自動管理され、物理リソースは手動管理が必要
- オブジェクトが参照されなくなると、メモリリソースは自動的に回収され、メモリリソースが解放されるが、物理リソースは依然として占有される
- 例:メモリリソース:読書エリアで本を読み、読み終わったらそのまま去る;物理リソース:本を借りるには積極的に返却する必要があり、返さなければ本を占有し続ける
Java のメモリ管理の基本原理#
- ヒープメモリ:オブジェクトインスタンスを格納
- スタックメモリ:基本データ型とオブジェクト参照を格納
Java の物理リソース管理における try-with-resources の動作原理#
これはJava 7
で導入された機能です
AutoCloseable
インターフェースを実装した任意のクラスが使用できます
コンパイラは自動的にfinally
を持つコードに変換します
// このようなコードを書くと:
try (FileInputStream file = new FileInputStream("test.txt")) {
// ファイルを使用
}
// コンパイラは自動的にこのようなコードに変換します:
FileInputStream file = new FileInputStream("test.txt");
try {
// ファイルを使用
} finally {
if (file != null) {
file.close();
}
}
Java で物理リソースを管理する方法#
- 従来の方法(推奨しない)
FileInputStream file = null;
try {
file = new FileInputStream("test.txt");
// ファイルを使用
} catch (Exception e) {
// 例外処理
} finally {
if (file != null) {
file.close(); // リソースを手動で閉じる
}
}
- 現代の方法(推奨)
try (FileInputStream file = new FileInputStream("test.txt")) {
// ファイルを使用
} catch (Exception e) {
// 例外処理
} // リソースを自動で閉じる
- Java リソース管理の完全なまとめ:
核心原則:
try-with-resources を使用してリソースを自動管理する
チェック例外を正しく処理する
「後入れ先出し」のリソースクローズ順序に従う
リソースタイプ:
管理が必要な一般的なリソース
- InputStream/OutputStream (ファイル操作)
- Connection/Statement/ResultSet (データベース操作)
- Socket (ネットワーク接続)
- Channel (NIO 操作)
標準テンプレート:
try (Resource1 r1 = new Resource1();
Resource2 r2 = new Resource2()) {
// リソースを使用
} catch (Exception e) {
// 例外処理
}
Java リソース管理の方法:#
- ファイルシステムリソース:
-
File クラスを使用
File file = new File("test.txt"); -
Path インターフェースを使用(Java 7+)
Path path = Paths.get("test.txt");
- ネットワークリソース:
-
URL クラスを使用
URL url = new URL("https://example.com");
URLConnection conn = url.openConnection(); -
Socket を使用
Socket socket = new Socket("localhost", 8080);
- クラスパスリソース:
-
ClassLoader を使用
InputStream is = getClass().getClassLoader().getResourceAsStream("config.properties"); -
Class を使用
InputStream is = MyClass.class.getResourceAsStream("/config.properties");
- データベースリソース:
- JDBC を使用
Connection conn = DriverManager.getConnection(url, username, password);