Java 7 新的 try-with-resources 语句,自动资源释放

红薯 发布于 2010/08/24 21:53
阅读 30K+
收藏 14
JDK

从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Management) ,自动资源管理。

新的语句支持包括流以及任何可关闭的资源,例如,一般我们会编写如下代码来释放资源:

private static void customBufferStreamCopy(File source, File target) {
    InputStream fis = null;
    OutputStream fos = null;
    try {
        fis = new FileInputStream(source);
        fos = new FileOutputStream(target);
 
        byte[] buf = new byte[8192];
 
        int i;
        while ((i = fis.read(buf)) != -1) {
            fos.write(buf, 0, i);
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    } finally {
        close(fis);
        close(fos);
    }
}
 
private static void close(Closeable closable) {
    if (closable != null) {
        try {
            closable.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码挺复杂的,异常的管理很麻烦。

而使用 try-with-resources 语句来简化代码如下:

private static void customBufferStreamCopy(File source, File target) {
    try (InputStream fis = new FileInputStream(source);
        OutputStream fos = new FileOutputStream(target)){
 
        byte[] buf = new byte[8192];
 
        int i;
        while ((i = fis.read(buf)) != -1) {
            fos.write(buf, 0, i);
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
代码清晰很多吧?在这个例子中,数据流会在 try 执行完毕后自动被关闭,前提是,这些可关闭的资源必须实现 java.lang.AutoCloseable 接口。
加载中
0
魔君
魔君
public static void customBufferStreamCopy(String[] args) throws Exception{
		@Cleanup InputStream in = new FileInputStream(args[0]);
		@Cleanup OutputStream out = new FileOutputStream(args[1]);
		byte[] buf = new byte[8192];  		   
        int i;  
        while ((i = in.read(buf)) != -1) {  
            out.write(buf, 0, i);  
        }  
	}
一个代码生成器感觉也不错
0
jing31
jing31

7还是有一些值得期待的地方的啊~

0
烈冰
烈冰

c#好像早就有类似的语法,记不清了。感觉Java语言的发展有点软,微软还硬点

0
y
yayalyon

类似C#的using

0
囧南风囧
囧南风囧

不错,不错,这语法有用!

0
d
damao

抄C#的么,C#对象如果实现了IDisposable接口就可以用using语句自动释放资源。不过好东西就该抄,期待Java 7快出来

0
aoyanfeng
aoyanfeng

- -!好东西要抄,要抄全部。

0
谦谦君子
谦谦君子
不错,好用~~
0
快慢机
快慢机
C#的using,啥时候switch也能那个像C#那么用啊
0
wffger
wffger
java: -source 1.6 中不支持 try-with-resources

  (请使用 -source 7 或更高版本以启用 try-with-resources)

我的JDK明明是1.7的!!

_晨风
_晨风
要看编译器版本
返回顶部
顶部