栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

没有在callable.call中关闭的BufferedReader会发生什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

没有在callable.call中关闭的BufferedReader会发生什么?

我要说的是,由于他们正在

BufferedReader
围绕给定对象创建
InputStream
代码,因此可以安全地不调用该代码
close()
。调用的代码
close()
应该始终是创建流并使用try
/ finally完成的代码。

public static void read(String str) throws IOException {    FileInputStream stream = null    try {        stream = new FileInputStream(str);        readStreamToConsole(stream);    } finally {        if (stream != null) stream.close();    }}private static void readStreamToConsole(InputStream stream) {    BufferedReader stdOut = new BufferedReader(new InputStreamReader(stream));    String output = null;    while ((output = stdOut.readLine()) != null)        System.out.println(output);}

另一个注意事项:您的代码似乎正在记录其他进程的输出。无论如何,您可能无法关闭流。如果不自己测试,我不确定如果关闭另一个进程的流会发生什么。

哦,这

IOException
不太可能发生,因为流来自另一个进程。除非发生一些不可恢复的错误,否则这不太可能发生。但是,以某种方式记录异常仍然不是一个坏主意。


编辑以解决您对混合答案的评论:

让我们使用输出流,

BufferedWriter
这次以一个示例为例:

private static final String newline = System.getProperty("line.separator");public static void main(String[] args) throws IOException {    String file = "foo/bar.txt";    FileOutputStream stream = null;    try {        stream = new FileOutputStream(file);        writeLine(stream, "Line 1");        writeLine(stream, "Line 2");    } finally {        if (stream != null) stream.close();    }}private static void writeLine(OutputStream stream, String line) throws IOException {    BufferedWriter writer = new BufferedWriter(new InputStreamWriter(stream));    writer.write(line + newline);}

这可行。writeLine方法用作创建

writer
单个
line
文件并将其实际写入文件的委托。当然,这种逻辑可能更复杂,例如将一个对象变成a
String
并将其写入。这也使该
main
方法更易于阅读。

现在,如果相反,我们关闭了BufferedWriter呢?

private static void writeLine(OutputStream stream, String line) throws IOException {    BufferedWriter writer = null;    try {        writer = new BufferedWriter(new InputStreamWriter(stream));        writer.write(line + newline);    } finally {        if (writer != null) writer.close();    }}

尝试以此运行它,它将在每次第二次

writeLine
调用时失败。最好始终在创建流的地方而不是在传递流的地方关闭流。最初可能没问题,但是随后尝试更改该代码可能会导致错误。如果我只
writeLine
使用坏方法进行了一次调用,而其他人想添加第二个调用,那么他们将不得不重构代码,以致
writeLine
始终无法关闭流。变得近距离开心可能会引起头痛。

还要注意,从技术上讲,

BufferedWriter
is不是系统资源的实际句柄,
FileOutputStream
而是is,因此无论如何,您都应该关闭实际资源。

因此,经验法则:仅在创建流的地方关闭流,并始终在try / finally块(或Java 7很棒的try /
resource块
,为您关闭)中进行创建和关闭。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/441064.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号