Java 7 為懶惰的Java開發人員帶來了一些非常好的功能。 嘗試資源 是這種功能之一,它可以減少代碼行,並使代碼更健壯。在本教程中,我將討論有關此功能的內容。 1. 資源清除的舊方法(在Java 7之前) 我們長期以來一直在這樣做。例如,從文件系統讀取文件。代碼可能看起來有所不同,但流程如下例所 ...
Java 7為懶惰的Java開發人員帶來了一些非常好的功能。嘗試資源是這種功能之一,它可以減少代碼行,並使代碼更健壯。在本教程中,我將討論有關此功能的內容。
1.資源清除的舊方法(在Java 7之前)
**我們長期以來一直在這樣做。例如,從文件系統讀取文件。代碼可能看起來有所不同,但流程如下例所示:
public class ResourceManagementBeforeJava7
{
public static void main(String[] args)
{
BufferedReader br = null;
try
{
String sCurrentLine;
br = new BufferedReader(new FileReader("C:/temp/test.txt"));
while ((sCurrentLine = br.readLine()) != null)
{
System.out.println(sCurrentLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (br != null)
br.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
這些類型的代碼在具有大量IO操作的應用程式代碼庫中非常常見。
try和catch塊中的代碼本質上很重要,並且具有一些特定於應用程式的邏輯。但是,終於封鎖了嗎?在大多數情況下,finall塊只是被覆制粘貼,目的是通過關閉它們來避免損壞資源。
當您有3-4個這樣的資源要在單個finally塊中關閉時,這些final塊看起來更難看。當我們知道時,您是否不認為這些final塊不必要地存在,我們必須以任何方式關閉資源而沒有任何例外情況?
Java 7通過try-with-resources功能解決了這個問題。#
2.使用try-with-resources的新方法(語法示例)
現在看看在Java 7中打開和關閉資源的新方法。
public class ResourceManagementInJava7
{
public static void main(String[] args)
{
try (BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt")))
{
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null)
{
System.out.println(sCurrentLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
有兩件事需要密切註意:
- 文件資源(BufferedReader)以特殊方式在try塊中打開(在小括弧內)。
- finally塊完全消失了。
最後但並非最不重要的一點是,代碼看起來很漂亮且易於閱讀。很好,對嗎?但是它實際上是如何工作的?
3.實際如何運作?
在Java 7中,我們有一個新的超級介面java.lang.AutoCloseable**。該介面有一種方法:
void close() throws Exception;
Java文檔建議此介面在不再需要時必須關閉的任何資源上實現。
當我們在特殊的try-with-resource塊中打開任何此類AutoCloseable資源時,在try塊完成後,JVM會對在“ try()”塊中初始化的所有資源立即調用close()方法。
例如,BufferedReader已實現close()方法文件如下:
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
}
由於上述方法定義,當JVM調用此方法時,所有基礎流或IO資源都將關閉。
4.向自定義資源添加功能
好吧,這是一個很好的資源清理設計。但是它僅適用於JDK本機類嗎?沒有。您也可以將其用於自定義資源。
例如,我在以下代碼中創建了一個自定義資源:
public class CustomResource implements AutoCloseable
{
public void accessResource() {
System.out.println("Accessing the resource");
}
@Override
public void close() throws Exception {
System.out.println("CustomResource closed automatically");
}
}
現在,我將在示例代碼中使用它:
public class TryWithCustomResource
{
public static void main(String[] args)
{
try(CustomResource cr = new CustomResource())
{
cr.accessResource();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Putput in console:
Accessing the resource
CustomResource closed automatically
5.總結
這就是Java 7中使用try-with-resources進行自動資源管理的全部內容。讓我們逐點記下重點內容:
- 在Java 7之前,我們必須使用finally塊來清理資源。最後,塊不是強制性的,但是清理資源是為了防止系統損壞。
- 使用Java 7,無需顯式的資源清理。它是自動完成的。
- 在try-with-resources塊(try(…){…})中初始化資源時完成自動資源清理。
- 由於發生了新界面AutoCloseable,因此發生了清理。try塊完成後,JVM將立即調用其close方法。
- 如果要在自定義資源中使用此功能,則必須實現AutoCloseable介面。否則程式將無法編譯。
- 您不應在代碼中調用close()方法。JVM應該自動將其稱為。手動調用它可能會導致意外結果。
學習愉快!