try-with-resource优雅关闭资源

it2025-08-09  9

try-with-resource优雅关闭资源

一、介绍

1、java7引入的新特性 2、优雅关闭资源 3、一种Java语法糖

二、使用

在JDK7之前的时候,关闭流资源需要在finally块中手动关闭。 在JDK7引入了一个新特性try-with-resource,我们只需要在try()的括号里声明使用的流资源,而不需要自己在finally中关闭资源。

@Test public void testCloseResource() { String originalUrl = "D:\\WorkSpace\\old.txt"; String targetUrl = "D:\\WorkSpace\\new.txt"; try ( FileInputStream fileInputStream = new FileInputStream(originalUrl); FileOutputStream fileOutputStream = new FileOutputStream(targetUrl); ) { byte[] bytes = new byte[1024]; int len; while ((len = fileInputStream.read(bytes)) != -1) { fileOutputStream.write(bytes, 0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

可以通过反编译查看反编译后的代码,可以发现已经实现了资源关闭。(反编译工具: JD-GUI、Jad 等,我这里直接使用IDEA查看的)

@Test public void testCloseResource() { String originalUrl = "D:\\WorkSpace\\old.txt"; String targetUrl = "D:\\WorkSpace\\new.txt"; try { FileInputStream fileInputStream = new FileInputStream(originalUrl); Throwable var4 = null; try { FileOutputStream fileOutputStream = new FileOutputStream(targetUrl); Throwable var6 = null; try { byte[] bytes = new byte[1024]; int len; while((len = fileInputStream.read(bytes)) != -1) { fileOutputStream.write(bytes, 0, len); } } catch (Throwable var34) { var6 = var34; throw var34; } finally { if (fileOutputStream != null) { if (var6 != null) { try { fileOutputStream.close(); } catch (Throwable var33) { var6.addSuppressed(var33); } } else { fileOutputStream.close(); } } } } catch (Throwable var36) { var4 = var36; throw var36; } finally { if (fileInputStream != null) { if (var4 != null) { try { fileInputStream.close(); } catch (Throwable var32) { var4.addSuppressed(var32); } } else { fileInputStream.close(); } } } } catch (FileNotFoundException var38) { var38.printStackTrace(); } catch (IOException var39) { var39.printStackTrace(); } }

三、注意点

1、只有实现了AutoCloseable接口,TWR才可以实现多资源自动关闭。 2、TWR避免异常屏蔽:将底层的异常追加到最外层的异常上。 3、ByteArrayInputStream等不需要检查关闭的资源对象。 4、使用Socket获取的InputStream和OutputStream对象不需要关闭(Socket关闭了,流就关闭了)。

最新回复(0)