Java try-with-resource

Java try-with-resource语句

Try-with-resourse语句类似于Python中的with语句,都是自动释放资源,而不用像传统的try-catch-finally一样必须使用finally关闭资源,而且当资源释放比较多的时候,会出现嵌套关闭资源的现象.

下面是一些具体使用方法

普通的资源释放方法

/**
    * @Description: 普通的资源释放方法
    * @Param: []
    * @return: void
    * @Author: Chen
    */
    @Test
    public void testDemo2() {
        Scanner scanner = null;
        try {
            scanner = new Scanner(new File("H:\\TestProject\\src\\main\\java\\com\\chen\\test.txt"));       //这里的路径一定要写完整路径
            while (scanner.hasNext()) {
                System.out.println(scanner.nextLine()); //逐行读取
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            //读取完毕则关闭
            if (scanner != null) {
                scanner.close();
            }
        }
    }

使用try-with-resource方法会自动关闭资源

/**
    * @Description: 使用try-with-resource方法会自动关闭资源
    * @Param: []
    * @return: void
    * @Author: Chen
    */
    @Test
    public void testDemo3() {
        try (Scanner scanner = new Scanner(new File("H:\\TestProject\\src\\main\\java\\com\\chen\\test.txt"))) {
            while (scanner.hasNext()) {
                //逐行读取文件中的内容
                System.out.println(scanner.nextLine());
            }
        } catch (FileNotFoundException file) {
            file.printStackTrace();
        }
    }

使用try-with-resource关闭多个资源

/**
    * @Description: 使用try-with-resource关闭多个资源
    * @Param:
    * @return:
    * @Author: Chen
    */
    @Test
    public void testDemo4() {
        try (Scanner scanner = new Scanner(new File("H:\\TestProject\\src\\main\\java\\com\\chen\\test.txt"));
            PrintWriter writer = new PrintWriter(new File("H:\\TestProject\\src\\main\\java\\com\\chen\\testWrite.txt"))
        ) {
            while (scanner.hasNext()) {
                //test.txt文件的内容写入到test2中
                writer.println(scanner.nextLine());
            }
        } catch (FileNotFoundException file) {
            file.printStackTrace();
        }
    }

测试资源关闭的顺序

import java.io.File;
import java.util.Scanner;

public class AutoCloseableResourcesFirst implements AutoCloseable {
    /**
    * @program: TestProject
    * @description: 需要被关闭的资源
    * @author: Mr.Wang
    * @create: 2019-04-29 11:37
    **/
    public AutoCloseableResourcesFirst() {
        System.out.println("构造方法----->第一个被自动释放的资源");
    }

    public void doSomething() {
        System.out.println("someThing方法----->第一个被自动释放的资源");
    }

    public void close() throws Exception {
        System.out.println("自动关闭资源1");
    }

}

public class AutoCloseableResourcesSecond implements AutoCloseable{
    /**
    * @program: TestProject
    * @description: 第二个被自动关闭资源的类
    * @author: Mr.Wang
    * @create: 2019-04-29 12:41
    **/
    public AutoCloseableResourcesSecond() {
        System.out.println("构造方法----->第二个被自动释放的资源");
    }

    public void doSomething() {
        System.out.println("someThing方法----->第二个被自动释放的资源");
    }

    public void close() throws Exception {
        System.out.println("自动关闭资源2");
    }
}

/**
 * @Description: 测试资源关闭的顺序
 * @Param: []
 * @return: void
 * @Author: Chen
 */
@Test
public void testDemo5() {
    try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst();
         AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {
        af.doSomething();
        as.doSomething();
    }catch (Exception e){
        e.printStackTrace();
    }
}

你可能感兴趣的:(Java)