首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Java编程技术

    浅谈AutoCloseable接口

    一、前言 最近在翻看中间件源码时候发现有些类实现了AutoCloseable接口,这个接口很生疏,所以搜了下资料,学习了下,下面做个总结。 二、AutoCloseable接口由来 从AutoCloseable的注释可知它的出现是为了更好的管理资源,准确说是资源的释放,当一个资源类实现了该接口close方法,在使用try-catch-resources 2.1 使用AutoCloseable之前资源管理方式 ? 所以AutoCloseable诞生了。 2.2 使用AutoCloseable进行资源管理 ? Resource实现了AutoCloseable的close方法: ? image.png 运行结果为: ? image.png 把read函数里面注释的抛异常代码打开,运行结果为: ?

    85520发布于 2018-09-06
  • 来自专栏vivo互联网技术

    浅谈 Java 中的 AutoCloseable 接口

    下面我们通过代码示例来了解如何使用,首先创建一个实现了AutoCloseable接口的类: public class Resource implements AutoCloseable{ public 以上是 AutoCloseable 的完整 Java doc,大概意思是: 像文件和socket等对象,在调用其close方法后才会释放持有的资源。 我们经常能见到一些基类实现了AutoCloseable接口,这是可行的,哪怕并不是所有的子类需要释放资源,或者哪怕并不是全部实例都持有需要释放的资源。 更一般的情况下,当一个异常的不当处理会导致题,AutoCloseable.close方法就不应该抛出这个异常。 与java.io.Closeable.close方法不同的是,AutoCloseable.close方法的调用不要求幂等。

    2.3K30发布于 2020-11-02
  • 来自专栏码农架构

    Closeable和AutoCloseable有什么区别?

    首发地址:Closeable和AutoCloseable有什么区别? 我们进行手动的编写close()方法进行关闭,然而,每次这些写会造成代码冗余不优雅,JDK中对于释放资源有Closeable和AutoCloseable可以使用,以下为详解。 如果在调用此方法之前 stream已经关闭 ,则方法失效; 建议先关闭内部的资源,并标记为已关闭; 优先抛出IO异常; AutoCloseable AutoCloseable接口位于java.lang包下 AutoCloseable源码 {try}-with-resources的使用注意 在1.7之前,我们通过try{} finally{} 在finally中释放资源。 {try}-with-resources关键点 带资源的try语句的3个关键点: 由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。

    69120发布于 2021-04-15
  • 来自专栏码农架构

    Closeable和AutoCloseable有什么区别?

    我们进行手动的编写close()方法进行关闭,然而,每次这些写会造成代码冗余不优雅,JDK中对于释放资源有Closeable和AutoCloseable可以使用,以下为详解。 如果在调用此方法之前 stream已经关闭 ,则方法失效; 建议先关闭内部的资源,并标记为已关闭; 优先抛出IO异常; AutoCloseable AutoCloseable接口位于java.lang包下 AutoCloseable源码 {try}-with-resources的使用注意 在1.7之前,我们通过try{} finally{} 在finally中释放资源。 {try}-with-resources关键点 带资源的try语句的3个关键点: 由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。

    4.7K50发布于 2021-04-22
  • 来自专栏云时代Java开发:原理、实战与优化

    Java源码详解:深入 Java IO 核心之AutoCloseable 源码全景深度解析:资源管理的现代契约

    序言本文以JDK21+最新源码为基础,通过设计思想解构、微观原理剖析、核心规范详解、工程实践指南四大维度,对AutoCloseable进行全景式深度解析。 最后,对比AutoCloseable与传统资源管理方式的差异,论证现代Java资源管理的演进路径。本文不仅是一份源码解读,更是一部资源管理设计智慧的教科书。 通过AutoCloseable这一“小”接口,读者将领悟到:真正的资源安全不在于复杂的异常处理逻辑,而在于声明式的契约和编译器的自动化支持。 关键词:AutoCloseable、try-with-resources、资源管理、异常抑制、Closeable、虚拟线程、云原生、源码解析前言:资源管理的演进革命为什么需要AutoCloseable? 在2026年高并发、低延迟的时代,AutoCloseable的价值不仅没有减弱,反而因为虚拟线程和云原生的普及而更加凸显。

    700编辑于 2026-04-27
  • 来自专栏博客迁移同步

    IO流异常标准处理代码(示范JDK1.7版本之前和JDK1.7版本的标准)

    java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; class myClose implements AutoCloseable = -1) { fos.write(b); } } // 这里的try是()而不是{},()里面的对象必须实现AutoCloseable (); } } } } } 1.7版本是try() 而不是try{} 能够写在try(...)的括号里面的类对象必须实现AutoCloseable ),会自动调用自己的close()方法去关流,所以FileInputStream和FileOutputStream都是实现了AutoCloseable 接口的 因为public class FileInputStream 所以它们是实现了AutoCloseable接口的,去FileInputStream和FileOutputStream里面都能找到close()方法的 是不是还没这么做过?

    32510编辑于 2023-05-06
  • 来自专栏程序那些事

    小师妹学JavaIO之:try with和它的底层原理

    resource就是资源,可以打开个关闭,我们可以把实现了java.lang.AutoCloseable接口的类都叫做resource。 先看下AutoCloseable的定义: public interface AutoCloseable { void close() throws Exception;} AutoCloseable 定义了一个close()方法,当我们在try with resource中打开了AutoCloseable的资源,那么当try block执行结束的时候,JVM会自动调用这个close()方法来关闭资源 in.close(); in = null; cb = null; }} 自定义resource 小师妹恍然大悟:F师兄,那么我们是不是可以实现AutoCloseable 当然可以了,我们举个例子,比如给你解答完这个问题,我就要去吃饭了,我们定义这样一个resource类: public class CustResource implements AutoCloseable

    44920发布于 2020-07-08
  • 来自专栏小灰灰

    如何优雅的在java中统计代码块耗时

    AutoCloseable 在 JDK1.7 引入了一个新的接口AutoCloseable, 通常它的实现类配合try{}使用,可在 IO 流的使用上,经常可以看到下面这种写法 // 读取文件内容并输出 IOException e) { e.printStackTrace(); } 注意上面的写法中,最值得关注一点是,不需要再主动的写stream.close了,主要原因就是在try(){}执行完毕之后,会调用方法AutoCloseable #close方法; 基于此,我们就会有一个大单的想法,下一个Cost类实现AutoCloseable接口,创建时记录一个时间,close 方法中记录一个时间,并输出时间差值;将需要统计耗时的逻辑放入try (){}代码块 下面是一个具体的实现: public static class Cost implements AutoCloseable { private long start; 这种方式可以看做是第一种写法的进阶版 // 定义类 public static class Cost implements AutoCloseable { private long start

    3.4K20发布于 2020-03-20
  • 来自专栏好好学java的技术栈

    你还在使用 try-catch-finally 关闭资源?不太优雅~

    ); } } } } JDK7及以后关闭资源的正确姿势 try-with-resource Resource的定义: 所有实现了 java.lang.AutoCloseable 简单Demo进行证实:实现java.lang.AutoCloseable接口的Resource类: /** * 资源类 * * @author hetiantian * */ public class Resource implements AutoCloseable { public void sayHello() { System.out.println("hello") 资源Resource.java /** * 资源类 * * @author hetiantian * */ public class Resource implements AutoCloseable 参考资料 [1] java.lang.AutoCloseable: http://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html

    77710发布于 2021-01-08
  • 来自专栏FreeBuf

    Fastjson小于1.2.68版本反序列化漏洞分析

    往下走的代码中,autoCloseable 满足不在白名单内,不在黑名单内,autoTypeSupport没有开启,expectClassFlag为false。 从明文缓存中取出autoCloseable赋值给 clazz。 ? ? 将检查完毕的autoCloseable进行反序列化,该类使用的是JavaBeanDeserializer反序列化器,从MapDeserializer中继承。 ? ? 期望类在这里发生了变化,expectClass的值变为java.lang.AutoCloseable,typeName为gadget, ? 其实已经开始读取gadget了,它本意应该是加载AutoCloseable。 ? 可以看到这里有读取文件的功能。 ? ?

    1.2K20发布于 2020-11-16
  • 来自专栏bit哲学院

    说说Java7 之 Try with Resources

    testWrite.txt"))) {     while (scanner.hasNext()) {     writer.print(scanner.nextLine());     } }  使用AutoCloseable 接口自定义资源  为了创建自定义可被 try-with-resources块自动处理的资源,则该类需要实现Closeable 或 AutoCloseable 接口,然后重载其close方法:  public class MyResource implements AutoCloseable {     @Override     public void close() throws Exception { );     } }  关闭资源顺序  最先定义的资源最后被关闭,请看示例:  第一个资源:  public class AutoCloseableResourcesFirst implements AutoCloseable 使用AutoCloseable 接口自定义资源以及资源关闭顺序。

    77220发布于 2021-04-27
  • 使用try-with-resources实现自动解锁

    而 try-with-resources 会自动管理资源的关闭,它要求使用的资源必须实现 AutoCloseable 接口。如何将锁与 try-with-resources 配合使用? 要使用 try-with-resources 自动解锁,我们可以将锁包装为一个实现了 AutoCloseable 接口的类。这样,在 try 语句块结束时,锁将自动释放。 AutoUnlock 类: 我们创建了一个 VVRLock 类,它实现了 AutoCloseable 接口。在构造函数中,它会在对象创建时立即获取锁,而在 close() 方法中会自动释放锁。 try-with-resources 语法背后的关键是它要求资源对象必须实现 AutoCloseable 接口。 通过将锁包装在一个实现了 AutoCloseable 接口的类中,我们可以利用 try-with-resources 在资源(即锁)不再需要时自动释放它。

    24700编辑于 2025-03-03
  • 来自专栏程序猿DD

    Fastjson < 1.2.68版本反序列化漏洞分析篇

    漏洞调试 从更新的补丁中可以看到expectClass类新增了三个方法分别为: java.lang.Runnable、java.lang.Readable、java.lang.AutoCloseable 往下走的代码中,autoCloseable 满足不在白名单内,不在黑名单内,autoTypeSupport没有开启,expectClassFlag为false。 typeName); 满足条件C后来到clazz的赋值,解析来的代码中对clazz进行了各种判断 clazz = TypeUtils.getClassFromMapping(typeName); 从明文缓存中取出autoCloseable deserializer = parser.getConfig().getDeserializer(userType); } 期望类在这里发生了变化,expectClass的值变为java.lang.AutoCloseable 其实已经开始读取gadget了,它本意应该是加载AutoCloseable

    1.9K20编辑于 2023-04-04
  • 来自专栏朱永胜的私房菜

    如何使用 try-with-resources 代替try-catch-finally?

    try-with-resources 是 Java 7 引入的一种语法结构,用于自动关闭实现了 AutoCloseable 接口的资源。 6. try-with-resources 的缺点 只能用于实现了 AutoCloseable 接口的资源类。 如果要使用 try-with-resources 来关闭其他类型的资源,需要手动实现 AutoCloseable 接口。 7. try-with-resources 的使用注意事项 资源类必须实现 AutoCloseable 接口或其子接口 Closeable。 但需要注意资源类必须实现 AutoCloseable 接口,并且在 try 后面的括号内声明的资源对象必须是 final 或 effectively final 的。

    2.8K40编辑于 2023-10-10
  • 来自专栏芋道源码1024

    这样统计代码执行耗时,才足够优雅!

    一、前言 二、常规方法 2.1 时间差统计 2.2 StopWatch 三、高级方法 3.1 Function 3.2 AutoCloseable 四、总结 ? 3.2 AutoCloseable 除了利用 Function 的特性,我们还可以使用 jdk 1.7 的 AutoCloseable 特性。 说 AutoCloseable 可能有同学没听过,但是给大家展示下以下代码,就会立刻明白是什么东西了。 // 未使用 AutoCloseable public static String readFirstLingFromFile(String path) throws IOException { 接口的对象,该对象作用于整个 try 语句块中,并且在执行完毕后回调 AutoCloseable#close() 方法。

    6.4K20发布于 2021-01-25
  • 来自专栏卓文见识

    从漏洞挖掘角度分析fastjson1.2.80 Bypass

    有两个: JavaBeanDeserializer ThrowableDeserializer 1)JavaBeanDeserializer 这是68版本绕过使用的gadget,即java.lang.AutoCloseable 作为expectClass,AutoCloseable子类持有文件句柄或者socket句柄,是很多类型的父接口,因此可以找到实现文件读取或写入的gadget。 这个方法通过反射拿到该类所有的方法存入methods,接下来遍历methods进而获取get、set方法: 同时也看到这里调用的反序列化器是默认的JavaBeanDeserializer: 剩下的就是找AutoCloseable ,满足前置条件: 最外层通过AutoCloseable绕过检测,调用MarshalOutputStream调用构造方法: { "@type": "java.lang.AutoCloseable JDK版本等: 进入这个三方依赖代码看下这个payload为什么可行: 继承Exception 存在getSystemInformation()方法,可获取系统信息 其他利用链的挖掘方法同上面的AutoCloseable

    3.7K41编辑于 2022-08-30
  • 来自专栏Happy的分享

    你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧

    什么资源可以被try-with-resources自动关闭 并不是所有资源都可以被try-with-resources自动关闭的,只有实现了java.lang.AutoCloseable接口的类,才可以被自动关闭 如果没有实现java.lang.AutoCloseable的类定义在try的括号内,则会在编译器就报错。 如,自定义一个类MyResource,定义在括号内则会报错:提示需要java.lang.AutoCloseable的类。 image.png 自定义可以被自动关闭的类 我们也可以把自己的类编写为可以被try-with-resources自动关闭的类,只需要我们去实现java.lang.AutoCloseable接口即可。 class MyResource implements java.lang.AutoCloseable { @Override public void close() {

    1.6K30发布于 2019-07-16
  • 来自专栏Java技术栈

    你还在使用 try-catch-finally 关闭资源?

    ); } } } } JDK7及以后关闭资源的正确姿势 try-with-resource Resource的定义: 所有实现了 java.lang.AutoCloseable 简单Demo进行证实:实现java.lang.AutoCloseable接口的Resource类: /** * 资源类 * * @author hetiantian * */ public class Resource implements AutoCloseable { public void sayHello() { System.out.println("hello") 资源Resource.java /** * 资源类 * * @author hetiantian * */ public class Resource implements AutoCloseable : http://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html [2] java.io.Closeable: http:/

    1K30发布于 2020-07-03
  • 来自专栏服务端思维

    这样统计代码执行耗时,才足够优雅!

    3.2 AutoCloseable 除了利用 Function 的特性,我们还可以使用 jdk 1.7 的 AutoCloseable 特性。 说 AutoCloseable 可能有同学没听过,但是给大家展示下以下代码,就会立刻明白是什么东西了。 // 未使用 AutoCloseable public static String readFirstLingFromFile(String path) throws IOException { = null) { br.close(); } } return null; } // 使用 AutoCloseable public static 接口的对象,该对象作用于整个 try 语句块中,并且在执行完毕后回调 AutoCloseable#close() 方法。

    57310发布于 2021-01-28
  • 来自专栏猫头虎博客专区

    这4种方式,统计代码执行耗时,才足够优雅!

    3.2 AutoCloseable 除了利用 Function 的特性,我们还可以使用 jdk 1.7 的 AutoCloseable 特性。 说 AutoCloseable 可能有同学没听过,但是给大家展示下以下代码,就会立刻明白是什么东西了。 // 未使用 AutoCloseable public static String readFirstLingFromFile(String path) throws IOException { = null) { br.close(); } } return null; } // 使用 AutoCloseable public static 接口的对象,该对象作用于整个 try 语句块中,并且在执行完毕后回调 AutoCloseable#close() 方法。

    1.7K10编辑于 2024-04-07
领券