为什么使用String初始化的InputStream在try-with-resources之外保持打开状态?

时间:2015-03-06 19:35:02

标签: java inputstream try-with-resources

我注意到由于流自动关闭,因此会按预期抛出IOException

BufferedReader bufferedReader;

try (FileReader fileReader = new FileReader(new File("pom.xml"))) {
    bufferedReader = new BufferedReader(fileReader);
}

bufferedReader.readLine();

而当使用InputStream初始化String时,它不会:

BufferedInputStream bufferedInputStream;

try (InputStream inputStream = IOUtils.toInputStream("test")) {
    bufferedInputStream = new BufferedInputStream(inputStream);
}

bufferedInputStream.read();

使用在括号外关闭的对象初始化BufferedReaderBufferedInputStream。它与InputStream内部处理String的方式有关吗?

2 个答案:

答案 0 :(得分:3)

answer provided by fge外,InputStream返回的IOUtils#toInputStream("test")ByteArrayInputStream,其close方法为无操作。

  

关闭ByteArrayInputStream无效。这个方法   在没有关闭流之后可以调用class   生成IOException

FileReader在内部维护文件的句柄。一旦您在close上调用FileReader,该句柄就会失效,然后包裹BufferedReader将无法使用它。这不会发生在ByteArrayInputStream

答案 1 :(得分:1)

你误解了一些事情。

自动关闭的唯一资源是初始资源中的

try (
    final R r1 = ...;
) {
    final R r2 = ...;
} // at this point, r1 is closed for you; r2 is NOT

请注意,您也可以在初始parens中声明多个资源。