如何使用带输出参数的类构造函数?BufferedWriter创建方式解析
关于BufferedWriter两种实例化方式的分析
第一种写法会引发内存泄漏吗?
先看你给出的嵌套构造代码:
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(destFile, false));
结论是:不会有内存泄漏问题。
BufferedWriter的构造逻辑会持有传入的FileWriter引用,当你调用bufferedWriter.close()时,它会自动调用底层FileWriter的close()方法,释放文件句柄等资源。只要你正常关闭BufferedWriter,底层资源就会被正确释放。
退一步说,如果实例化过程中抛出异常(比如FileWriter创建失败),此时没有任何变量持有这个未完成初始化的FileWriter,JVM的垃圾回收机制会自动回收它,不会遗留资源泄漏。
两种写法的优劣对比
写法一:嵌套构造实例化
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(destFile, false));
- 优势:
- 代码简洁,少一行变量声明,适合简单的写入场景
- 没有多余的变量名,代码更紧凑
- 劣势:
- 无法单独操作底层的FileWriter,所有操作只能通过BufferedWriter完成(比如想手动调用FileWriter的
flush(),这种场景极少,但如果有需求就做不到) - 异常处理相对繁琐,如果要单独捕获FileWriter构造时的异常,嵌套结构会让try-catch的逻辑更绕
- 无法单独操作底层的FileWriter,所有操作只能通过BufferedWriter完成(比如想手动调用FileWriter的
写法二:分开声明变量实例化
FileWriter fileWriter = new FileWriter(destFile, false); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
- 优势:
- 可以直接访问FileWriter实例,满足极少数需要直接操作底层流的场景
- 异常处理更灵活,能单独针对FileWriter的创建过程捕获异常,逻辑更清晰
- 流的层级关系一目了然,可读性更好
- 劣势:
- 多了一行变量声明,代码稍微繁琐一点
最佳实践建议
两种写法本身都没问题,但核心是必须保证流被正确关闭,推荐使用Java 7引入的try-with-resources语句,它能自动帮你关闭资源,避免手动关闭时遗漏(比如忘记在finally块里关闭,或者关闭顺序错误)。
对应两种写法的try-with-resources版本:
- 嵌套构造的简化版:
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(destFile, false))) { // 执行写入操作 } catch (IOException e) { // 处理异常,比如打印日志或抛出业务异常 }
- 分开声明的清晰版:
try (FileWriter fileWriter = new FileWriter(destFile, false); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) { // 执行写入操作 } catch (IOException e) { // 处理异常 }
如果只是常规写入,不需要操作底层FileWriter,嵌套写法足够简洁;如果需要更灵活的异常处理或者特殊场景下操作底层流,就用分开声明的方式。但无论哪种,用try-with-resources是最稳妥的做法。
内容的提问来源于stack exchange,提问作者Tajuddin Khandaker
相关产品推荐
相关产品推荐

