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 資源管理的方式:#
1. 文件系統資源:
-
使用 File 類
File file = new File("test.txt"); -
使用 Path 接口(Java 7+)
Path path = Paths.get("test.txt");
2. 網絡資源:
-
使用 URL 類
URL url = new URL("https://example.com");
URLConnection conn = url.openConnection(); -
使用 Socket
Socket socket = new Socket("localhost", 8080);
3. 類路徑資源:
-
使用 ClassLoader
InputStream is = getClass().getClassLoader().getResourceAsStream("config.properties"); -
使用 Class
InputStream is = MyClass.class.getResourceAsStream("/config.properties");
4. 數據庫資源: -
使用 JDBC
Connection conn = DriverManager.getConnection(url, username, password);