在我们使用资源时,一般资源使用完毕,都需要把资源关闭掉,在JDK7之前,我们一般都是使用try-catch-finally在finally中进行资源的关闭。
示例如下:
public static void test1(){
FileInputStream ins = null;
FileOutputStream out = null;
try {
ins = new FileInputStream(new File("G://aa.text"));
out = new FileOutputStream(new File("G://bb.text"));
//业务逻辑
}catch (FileNotFoundException ex){
ex.printStackTrace();
}finally {
//关闭资源
if(ins != null){
try {
ins.close();
}catch (Exception insex){
insex.printStackTrace();
}
}
if(out != null){
try {
out.close();
}catch (Exception outex){
outex.printStackTrace();
}
}
}
}
我们使用了输入流和输出流,在使用完后,需要手动去关闭。
在jdk7后,提供了一种新的方式:try-with-resources 方式来管理资源,在try中声明资源,当程序执行完后,会自动将声明的资源关闭掉,方式如下:
public static void test2(){
try(FileInputStream ins = new FileInputStream(new File("G:/aa.text"));
FileOutputStream out = new FileOutputStream(new File("G://bb.text"))){
//业务逻辑
}catch (FileNotFoundException fnex){
fnex.printStackTrace();
}catch (IOException ioex){
ioex.printStackTrace();
}
}
附:
资源一般是指:实现了Closeable接口或者AutoCloseable接口,这种资源使用完毕后都需要关闭。
package java.io;
import java.io.IOException;
/**
* A {@code Closeable} is a source or destination of data that can be closed.
* The close method is invoked to release resources that the object is
* holding (such as open files).
*
* @since 1.5
*/
public interface Closeable extends AutoCloseable {
/**
* Closes this stream and releases any system resources associated
* with it. If the stream is already closed then invoking this
* method has no effect.
*
* <p> As noted in {@link AutoCloseable#close()}, cases where the
* close may fail require careful attention. It is strongly advised
* to relinquish the underlying resources and to internally
* <em>mark</em> the {@code Closeable} as closed, prior to throwing
* the {@code IOException}.
*
* @throws IOException if an I/O error occurs
*/
public void close() throws IOException;
}