问题的引入
InputStream inputStream = new FileInputStream(path);
InputStreamReader inputStreamReader= new InputStreamReader(inputStream , "utf-8");
BufferedReader bufferedReader= new BufferedReader(inputStreamReader);
在各种流使用完以后需要将每个流都关闭吗,还是只要关闭最外层或是最内层的流就行了?
只需要直接调用最外层的
close()
方法
这里先给出答案,有兴趣的朋友可以看下面测试内容:
测试
InputStream inputStream = null;
Reader reader = null;
try {
inputStream = CommonUtil.getConfigFilesStream(fileName);
reader = new InputStreamReader(inputStream, "utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
jsonStr = sb.toString();
} catch (Exception e) {
log.error(">>>>>>>>>>>>>>>读取resources下的json文件出现异常,读取失败!<<<<<<<<<<<<<<<");
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
log.error("reader流关闭发生异常");
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
log.error("InputStream流关闭发生异常");
}
}
try {
inputStream.read();
} catch (IOException e) {
e.printStackTrace();
log.error("InputStream 流已经被关闭了");
}
}
总结以下几点:
- 判断一个流是否被关闭,是没有提供直接的
API
方法判别的。这里要辟个谣,有人说可以通过判断比如inputStream == null
来确认流是否被关闭,这是行不通的。
可根据:
try {
inputStream.read();
} catch (IOException e) {
e.printStackTrace();
log.error("InputStream 流已经被关闭了");
}
如果被捕获到异常,则会显示当前流已经被关闭了。
-
当
reader.close()
方法执行后,也就是说外层包装流关闭了,就算inputStream
未显式调用关闭方法,reader
和inputStream
流都被关闭了。 -
可通过
try
,catch
,finally
去捕获流的异常,流的关闭一般会放在finally
语句中执行。
InputStream inputStream = null;
Reader reader = null;
try {
inputStream = CommonUtil.getConfigFilesStream(fileName);
reader = new InputStreamReader(inputStream, "utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
jsonStr = sb.toString();
} catch (Exception e) {
log.error(">>>>>>>>>>>>>>>读取resources下的json文件出现异常,读取失败!<<<<<<<<<<<<<<<");
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
log.error("reader流关闭发生异常");
}
}
}
网友评论