如何使用 Java7 try-with-resources 功能将资源作为参数传递

Posted

技术标签:

【中文标题】如何使用 Java7 try-with-resources 功能将资源作为参数传递【英文标题】:how to use Java7 try-with-resources feature for resources passes as params 【发布时间】:2015-10-14 06:44:31 【问题描述】:

我见过java7 try-with-resources。如果可关闭的资源是作为参数来的,我们不需要声明资源。对于这种情况我们如何使用这个功能?

public static void write(byte[] b, OutputStream os) throws Exception 
    try 
        os.write(b);
    
    catch(Exception e) 
        logger.log(Level.INFO, "Exception in writing byte array");
    
    finally 
        try 
            if(os != null) 
                os.close();
            
        catch(Exception e) 
            logger.log(Level.INFO, "Exception while close the outputstream");
            throw e;
        
    

【问题讨论】:

附注:关闭流通常是打开流的实体的责任。您接受开放流并在返回之前将其关闭似乎很奇怪。 (如果我想使用您的方法将内容写入文件,然后在您的内容后附加其他内容怎么办?) 如果你真的想这样做,你可以简单地做try (OutputStream os2 = os) ... 就我而言,我确信我不会在之后附加内容。我将这段代码作为实用方法编写。 它是否是内部方法并不重要。无论如何,这都是糟糕的设计。如果你设计得当,很明显如何使用资源尝试:你只需做try (FileWriter fw = new FileWriter("foo")) write(b, fw); 我回应@aioobe 所说的,我刚刚在这里***.com/a/33117857/3788176 提出了同样的观点,关闭其他人的流是问题的原因。如果您必须关闭该方法中的流,我会调用方法writeAndCloseStream 以明确该方法中的流会发生什么。 【参考方案1】:

你可以简单地写:

static void write(byte[] b, OutputStream os) throws Exception 
    try (OutputStream o = os) 
        o.write(b);
    

【讨论】:

如果我们这样做,资源“o”只会自动关闭,“os”资源保持打开状态? 因为o = os os 是关闭的,因为它是同一个东西。【参考方案2】:

一旦 try 块完成,它将调用方法 close 来关闭资源

    try (BufferedWriter bw = new BufferedWriter(new FileWriter("file.out"))) 
        bw.write("something");
    

资源应该实现Closable接口

【讨论】:

以上是关于如何使用 Java7 try-with-resources 功能将资源作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

Java7提供的Fork/Join框架实现高并发程序,你会使用吗?

教你用Java7的Fork/Join框架开发高并发程序

java7中switch比较字符串

如何在 java7 中处理异常“javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure”

如何在 Java 7 和 8 中找出字体文件路径

Java 7:如何在 Java 中实现拖放?