昨天在封装一FileReader工具类的时候,写了这样一段代码:
public static String read(InputStream is, boolean inputStreamNeedToBeClosed) {
InputStreamReader isr = null;
BufferedReader br = null;
try {
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String lineData = "";
StringBuilder sb = new StringBuilder();
while ((lineData = br.readLine()) != null) {
sb.append(lineData);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStreamNeedToBeClosed) {
if (is != null) {
System.out.println("close");
is.close();
}
}
} catch (Exception e) {
} finally {
if (isr != null) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
return null;
}
方法read的第二个参数代表完成操作后,是否需要关闭Inputstream.
测试的时候发现,无论第二个参数是true还是false,流一样会关闭.
于是乎看了一下BufferedReader和InputStreamReader的代码
BufferedReader的部分源码:
private Reader in;
public BufferedReader(Reader in) {
this(in, defaultCharBufferSize);
}
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();
} finally {
in = null;
cb = null;
}
}
}
InputStreamReader的部分源码:
private final StreamDecoder sd;
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
} catch (UnsupportedEncodingException e) {
// The default encoding should always be available
throw new Error(e);
}
}
public void close() throws IOException {
sd.close();
}
可以看到,BufferedReader和InputStreamReader的close方法都主动去把构造时的入参给close掉了.
同样可以查看BufferedInputStream的close,也是类似的操作.
总结:
使用BufferedReader,InputStreamReader,BufferedInputStream等类时,不必写嵌套的try catch finally,只需在最后的引用里close掉即可.
当然,不排除有一些特殊的例子,所以使用前应该自己先做测试.