我注意到由于流自动关闭,因此会按预期抛出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();
使用在括号外关闭的对象初始化BufferedReader
和BufferedInputStream
。它与InputStream
内部处理String
的方式有关吗?
答案 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中声明多个资源。