当前位置: 首页 > 知识库问答 >
问题:

使用try-with-resources时,当某个自定义类实现可关闭接口时,FileInputStream实例是如何自动创建的

薄烨
2023-03-14
try(FileReader rd = new FileReader("Test.txt");){} 
catch (Exception e) {e.printStackTrace();}

这就是我的研究过程开始的地方。

在做了一些调试之后,我发现FileReader扩展了InputStreamReader。在FileReader类中,此构造函数调用

public FileReader(File file) throws FileNotFoundException {
  super(new FileInputStream(file));
}

它创建FileInputStream类的对象。FileInputStream扩展了InputStream,后者实现了可关闭的接口。

public void close() throws IOException {
        synchronized (closeLock) {
            if (closed) {
                return;
            }
            closed = true;
        }
        if (channel != null) {
           channel.close();
        }

        fd.closeAll(new Closeable() {
            public void close() throws IOException {
               close0();
           }
        });
    }
public class MyClass implements Closeable 
    {
        public void close() 
       {
         System.out.println("connection closed...");
       }
    }
try(MyClass rd = new MyClass();)
{} 
catch (Exception e) 
{e.printStackTrace();}
public void close() throws IOException {
        synchronized (closeLock) {
            if (closed) {
                return;
            }
            closed = true;
        }
        if (channel != null) {
           channel.close();
        }

        fd.closeAll(new Closeable() {
            public void close() throws IOException {
               close0();
           }
        });
    }

提前谢了。

共有1个答案

钱志强
2023-03-14

在回答实际问题之前,了解资源尝试是如何工作的是很重要的。为此,我们可以参考Java语言规范(JLS)的§14.20.3。从本质上讲,这一章告诉您的是,如果您有以下代码:

try (AutoCloseable closeable = ...) {
  // try something
}

注意:try-with-resources语句适用于任何java.lang.autocloseable实现。java.io.closeable接口扩展了java.lang.autocloseable接口。

然后由编译器翻译,就像您写了类似的内容:

AutoCloseable closeable = ...;
Throwable primary = null;
try {
  // try something
} catch (Throwable t) {
  primary = t;
  throw t;
} finally {
  if (closeable != null) {
    if (primary != null) {
      try {
        closeable.close();
      catch (Throwable suppressed) {
        primary.addSuppressed(suppressed);
      }
    } else {
      closeable.close();
    }
  }
}
try (AutoCloseable closeable = ...) {
  // try something
} catch (Exception ex) {
  // handle error
} finally {
  // finally...
}
try {
  // "basic" translation
} catch (Exception ex) {
  // handle error
} finally {
  // finally...
}
import java.io.Closeable;
import java.io.IOException;

public class Main {

  public static void main(String[] args) {
    try (MyClass foo = new MyClass()) {
      // try something...
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

  public static class MyClass implements Closeable {
    
    @Override
    public void close() throws IOException {
      System.out.println("MyClass#close()");
    }
  }
}
import java.io.Closeable;
import java.io.IOException;

public class Main {

  public static void main(String[] args) {
    MyClass foo = new MyClass();
    Throwable primary = null;
    try {
      try {
        // try something...
      } catch (Throwable t) {
        primary = t;
        throw t;
      } finally {
        if (foo != null) {
          if (primary != null) {
            try {
              foo.close();
            } catch (Throwable suppressed) {
              primary.addSuppressed(suppressed);
            }
          } else {
            foo.close();
          }
        }
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

  public static class MyClass implements Closeable {

    @Override
    public void close() throws IOException {
      System.out.println("MyClass#close()");
    }
  }
}
 类似资料:
  • 本文向大家介绍Java使用 try-with-resources 实现自动关闭资源的方法,包括了Java使用 try-with-resources 实现自动关闭资源的方法的使用技巧和注意事项,需要的朋友参考一下 1、 在Java1.7之前,我们需要通过下面这种方法, 在finally中释放资源,这种方法有点繁琐。 2、在java1.7之后,可以使用try-with-resources实现自动关闭资

  • 示例: 我没有任何对或的引用,它们也会被关闭吗? 谢啦

  • 我在块中创建了数量可变的对象。在任何退出点,我都希望关闭所有分配的资源。 我可以想象自己写一些东西来做这件事,但是有没有类似于Python的Contextlib的现有实用程序。将关闭分配的资源的ExitStack?我希望它看起来像这样: (注意:这不是这个问题,因为我不知道我会提前准备多少资源。)。 嘿,close投票者我不是在要求一个库,我是在问你如何安全地关闭动态数量的s,如果有语言功能,很好

  • 问题内容: 声纳给出了一个错误,应该将其关闭。我需要修改以下代码才能使用。我该怎么做呢? 问题答案: 当前,代码尚不准备处理异常-您丢失了finally块来关闭打开的流。而且,当然,您是对的-使用try-with-resources解决了这个问题:

  • 我在Java应用程序中使用Spring,所有@Autowired注释到目前为止都在工作。 一旦我尝试启动应用程序,我得到: 该接口仅包含两个公共简单方法,该类实现了它们 这两个类都是公共的,并且都有公共的默认构造函数。(我甚至尝试在测试中实例化它们。 删除部分后,一切正常 接口的实现会有什么问题?什么是< code>$ProxyXX?

  • 我正在尝试使用new关键字创建一个组件的新实例。组件类有另一个类的自动布线。在第一类中,它有一个调用第二类的方法。代码如下: First.java 第二Java语言 一个pplication.java 我能够使用依赖注入来训练解决方案。我只是想这样做。 提亚