我知道必须有一个与try子句中的资源相关联的变量声明。
但是,除了分配通常的资源实例化之外,是否可以为其分配已经存在的资源,例如:
public String getAsString(HttpServletRequest request) throws Exception {
try (BufferedReader in = request.getReader(); ){
etc
}
}
即。 BufferedReader
会自动关闭,就像直接在try子句中实例化的资源一样吗?
答案 0 :(得分:4)
是即可。任何AutoCloseable
的内容都会调用close
方法。 try-with-resource会做到这一点。
答案 1 :(得分:2)
我们可以使用此代码测试是否为真:
class Main {
public static void main(String[]args) throws Exception {
AutoCloseable _close = getCloseable()
try (AutoCloseable close = _close) {
// ...
}
}
public static AutoCloseable getCloseable() {
return new MyCloseable();
}
}
class MyCloseable implements AutoCloseable {
@Override
public void close() {
System.out.println("Closing");
}
}
输出结果为"结束"。这意味着,在AutoCloseable
块之前创建的try
确实仍会在try
块之后关闭。
实际上,只要它实现()
,Java就不关心你放在try
块的AutoCloseable
中的内容。在运行时,表达式将自动计算为一个值,无论它是否为new
表达式。
答案 2 :(得分:1)
是的,BufferedReader
将自动关闭。
从Java 7开始,接口AutoCloseable
被添加为Closeable
的SuperInterface,因此所有实现的Closeable
类(即资源类)接口都会自动继承AutoCloseable
接口。