我们深知在操作Java流对象后要将流关闭,但往往事情不尽人意,大致有以下几点需要注意的地方。
在finally中关流
- 错误示例
try {
OutputStream out = new FileOutputStream("");
// ...操作流代码
out.close();
} catch (Exception e) {
e.printStackTrace();
}
- 正确方案
OutputStream out = null;
try {
out = new FileOutputStream("");
// ...操作流代码
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out);
}
//IOUtils.java
public static void closeQuietly(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (IOException ioe) {
LogUtils.e(ioe);
}
}
在关闭多个流时不要在一个try中
- 错误示例
OutputStream out = null;
OutputStream out2 = null;
try {
out = new FileOutputStream("");
out2 = new FileOutputStream("");
// ...操作流代码
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();// 如果此处出现异常,则out2流没有被关闭
}
if (out2 != null) {
out2.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
- 正确方案
OutputStream out = null;
OutputStream out2 = null;
try {
out = new FileOutputStream("");
out2 = new FileOutputStream("");
// ...操作流代码
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out2);
IOUtils.closeQuietly(out);
}
此外,在关闭多个流时,需要注意关闭顺序
,通常有以下几个原则:
1.先打开的后关闭,后打开的先关闭
2.看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
在循环中创建流,在循环内关闭每个流
- 错误示例
OutputStream out = null;
try {
for (int i = 0; i < 10; i++) {
out = new FileOutputStream("");
// ...操作流代码
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out);
}
- 正确方案
for (int i = 0; i < 10; i++) {
OutputStream out = null;
try {
out = new FileOutputStream("");
// ...操作流代码
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out);
}
}
Java 7提供try-catch-resources接口处理流的关闭
只要实现的自动关闭接口(Closeable
)的类都可以在try结构体上定义,java会自动帮我们关闭,及时在发生异常的情况下也会。可以在try结构体上定义多个,用分号隔开即可。
try (OutputStream out = new FileOutputStream("");
OutputStream out2 = new FileOutputStream("")){
// ...操作流代码
} catch (Exception e) {
throw e;
}
注意:在Android中,API19以上版本才支持该功能