Java提供了一种功能,可以使代码更加健壮并减少代码行。此功能称为自动资源管理(ARM),使用Java 7以上的try-with-resources。try-with-resources语句是一个声明一个或多个资源的try语句。 此语句确保在语句结束时关闭每个资源,这样可以在出现错误或成功完成代码块时轻松处理需要处理或关闭的外部资源。

什么是资源?

资源是在程序使用完毕后必须关闭的对象。实现java.lang.AutoCloseable的任何对象(包括实现java.io.Closeable的所有对象)都可以用作资源。

旧资源清理方法 - 最后使用

在JDK 1.7之前的早期版本的Java中,资源的关闭是使用finally块完成的。

// Java program to illustrate cleaning of 
// resources before Java 7

import java.io.*;
import java.util.*;
import java.io.*;
class Resource 
{
    public static void main(String args[]) 
    {
        BufferedReader br = null;
        String str = " ";
        
        System.out.println("Enter the file path");
        br = new BufferedReader(new InputStreamReader(System.in));
        
        try
        {
               str = br.readLine();     
        }
        catch(IOException e)
        {
            e.printStackTrace(); 
        } 
        
        try
        {
            String s;
            
            // file resource
            br = new BufferedReader(new FileReader(str)); 
            
            while ((s = br.readLine()) != null) 
            {
                //print all the lines in the text file
                System.out.println(s); 
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        
        finally
        {
            try
            {
                if (br != null)
                
                    //closing the resource in 'finally' block
                    br.close(); 
            } 
            catch (IOException ex) 
            {
                ex.printStackTrace();
            }
        }
    }
}

输出:

hello
java

新方法 - 使用try-with-resources

在try-with-resources方法中,没有使用finally块。文件资源在小括号内的try块中打开。只能在实现AutoCloseable接口的块中打开这些类的对象,并且这些对象也应该是本地的。无论try语句是正常还是突然完成,资源都将自动关闭。 语法: 以下示例从文件中读取第一行。它使用BufferedReader实例从文件中读取数据。BufferedReader是一个在程序完成后必须关闭的资源:

static String readFirstLineFromFile(String path)抛出IOException
{
    try(BufferedReader br = new BufferedReader(new FileReader(path)))
    {
        return br.readLine();
    }
}
// Java program to illustrate 
// Automatic Resource Management 
// in Java without finally block
import java.io.*;
import java.io.*;
import java.util.*;
class Resource 
{
    public static void main(String args[]) 
    {
        String str = ""; 
        BufferedReader br = null;
        
        System.out.println("Enter the file path");
        br = new BufferedReader(new InputStreamReader(System.in));
        
        try
        {
            str=br.readLine();
        }
        catch(IOException e)
        {
            e.printStackTrace(); 
        } 
        
        // try with Resource
        // note the syntax difference
        try (BufferedReader b = new BufferedReader(new FileReader(str)))
        {
            String s;
            while ((s = b.readLine()) != null) 
            {
                System.out.println(s);
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

输出:

hello 
java

多种资源中的自动资源管理

可以在try-with-resources块中使用多个资源,并使它们全部自动关闭。在这种情况下,资源将按照在括号内创建它们的相反顺序关闭。

// Java program to illustrate 
// Automatic Resource Management 
// in Java with multiple resource
class Resource
{
    public static void main(String s[])
    {
        //note the order of opening the resources
        try(Demo d = new Demo(); Demo1 d1 = new Demo1()) 
        {
            int x = 10/0;
            d.show();
            d1.show1();
        }
        catch(ArithmeticException e)
        {
            System.out.println(e);
        }
    }
}

// custom resource 1
class Demo implements AutoCloseable 
{
    void show()
    {
        System.out.println("inside show");
    }
    public void close()
    {
        System.out.println("close from demo");
    }
}

//custom resource 2
class Demo1 implements AutoCloseable 
{
    void show1()
    {
        System.out.println("inside show1");
    }
    public void close()
    {
        System.out.println("close from demo1");
    }
}

输出:

close from demo1
close from demo

注意:在上面的示例中,Demo和Demo1是try块内部管理的自定义资源。此类资源需要实现AutoCloseable接口。当我们在特殊的try-with-resource块中打开任何这样的AutoCloseable资源时,在完成try块之后,JVM立即在try块中初始化的所有资源上调用this.close()方法。 重点:

  1. finally 7用于在Java 7之前清理资源。
  2. 在java 7之后,资源清理自动完成。
  3. 由于接口AutoCloseable,在try-with-resources块中初始化资源时完成ARM。一旦try块完成,它的close方法就会被JVM调用。
  4. 调用close()方法可能会导致意外结果。
  5. 我们在try-with-resource中使用的资源必须是AutoCloseable的子类型,以避免编译时错误。
  6. 必须以与上例中给出的相反的顺序关闭在多个资源ARM中使用的资源

 
转载请保留页面地址:https://www.breakyizhan.com/java/4997.html
扫描二维码添加微信 
  • ,每次淘宝领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘50元优惠券!添加微信后回复机械键盘即可领取!
    支持我们,就用微信淘宝!