JDK的AutoCloseable,Closeable和Flushable使用详解

探究java IO之AutoCloseable,Closeable和Flushable接口

 

有3个接口对于流类相当重要。

其中两个接口是CloseableFlushable,它们是在java.io包中定义的,并且是由JDK5添加的。

第3个接口是AutoColseable,它是由JDK7添加的新接口,被打包到java.lang包中。

AutoCloseable接口对JDK7新添加的带资源的try语句提供了支持,这种try语句可以自动执行资源关闭过程。只有实现了AutoCloseable接口的类的对象才可以由带资源的try语句进行管理。AutoCloseable接口只定义了close()方法:

void close() throws Exception;

这个方法关闭调用对象,释放可能占用的所有资源。在带资源的try语句的末尾,会自动调用该方法,因此消除了显式调用close()方法的需要。

Closeable接口也定义了close()方法。实现了Closeable接口的类的对象可以被关闭。从JDK7开始,Closeable扩展了AutoCloseable。因此,在JDK7中,所有实现了Closeable接口的类也都实现了AutoCloseable接口。

再看Flushable 

package java.io;

import java.io.IOException;

/**
 * A <tt>Flushable</tt> is a destination of data that can be flushed.  The
 * flush method is invoked to write any buffered output to the underlying
 * stream.
 *
 * @since 1.5
 */
public interface Flushable {

    /**
     * Flushes this stream by writing any buffered output to the underlying
     * stream.
     *
     * @throws IOException If an I/O error occurs
     */
    void flush() throws IOException;
}

刷新流通常会导致缓存的输出被物理地写入到底层设备中。写入流的所有I/O类都实现了Flushable接口。

注:关于带资源的try语句的3个关键点:

  • 由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。

  • 在try代码中声明的资源被隐式声明为fianl。

  • 通过使用分号分隔每个声明可以管理多个资源。

带资源的try语句(try-with-resource)的最简形式为:

try(Resource res = xxx)//可指定多个资源
{
     work with res
}                                                                        

try块退出时,会自动调用res.close()方法,关闭资源。

此外请记住,所声明资源的作用域被限制在带资源的try语句中。带资源的try语句的主要优点是:当try代码块结束时,资源(在此时流)会被自动关闭。因此,不太可能会忘记关闭流。使有带资源的try语句,通常可以使源代码更短,更清晰,更容易维护。如例:

public class InputStreamReaderTest {
    public static void main(String[] args) {
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(        
                new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){
            System.out.println(reader.readLine());    //这里直接读一行
        }catch(IOException e){
            e.printStackTrace();
        }
    }

再如

    @Test
    public void jedisPool(){
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(30);//最大连接数
        config.setMaxIdle(10);//最大空闲连接数
        try (JedisPool jedisPool = new JedisPool(config, "xxx", 6379); Jedis jedis = jedisPool.getResource()) {
            jedis.auth("root");
            jedis.set("jedis", "谢飞");
            String name = jedis.get("jedis");
            System.out.println(name);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

(完)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值