Java部分流关闭时的源码操作

昨天在封装一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掉即可.

当然,不排除有一些特殊的例子,所以使用前应该自己先做测试.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值