java中file需要关闭吗_java - 我是否需要关闭()FileReader和BufferedReader?

java - 我是否需要关闭()FileReader和BufferedReader?

我正在使用围绕FileReader的BufferedReader读取本地文件:

BufferedReader reader = new BufferedReader(new FileReader(fileName));

// read the file

// (error handling snipped)

reader.close();

我是否还需要close() FileReader,或者包装器会处理吗?我见过人们这样做的代码:

FileReader fReader = new FileReader(fileName);

BufferedReader bReader = new BufferedReader(fReader);

// read the file

// (error handling snipped)

bReader.close();

fReader.close();

从servlet调用此方法,我想确保不打开任何句柄。

8个解决方案

193 votes

没有。

BufferedReader.close()

根据BufferedReader和InputStreamReader的javadoc关闭流

以及

FileReader.close()

确实。

Atmocreations answered 2019-04-23T07:11:05Z

87 votes

正如其他人指出的那样,您只需要关闭外包装。

BufferedReader reader = new BufferedReader(new FileReader(fileName));

如果BufferedReader构造函数抛出异常(例如OutOfMemoryError),则可能会泄漏文件句柄的可能性非常小。 如果您的应用程序处于此状态,那么清理需要多么谨慎可能取决于您不会剥夺操作系统可能要分配给其他程序的资源的重要性。

如果包装器构造函数可能在Java 5或6中失败,则可以使用Closeable接口:

Reader reader = new FileReader(fileName);

Closeable resource = reader;

try {

BufferedReader buffered = new BufferedReader(reader);

resource = buffered;

// TODO: input

} finally {

resource.close();

}

Java 7代码应该使用try-with-resources模式:

try (Reader reader = new FileReader(fileName);

BufferedReader buffered = new BufferedReader(reader)) {

// TODO: input

}

McDowell answered 2019-04-23T07:11:54Z

6 votes

根据BufferedReader源代码,在这种情况下bReader.close调用fReader.close,所以从技术上讲你不必调用后者。

Csaba_H answered 2019-04-23T07:12:19Z

4 votes

BufferedReader的源代码显示关闭BufferedReader时底层是关闭的。

Brian Agnew answered 2019-04-23T07:12:45Z

3 votes

检查源代码后,我发现了例子:

FileReader fReader = new FileReader(fileName);

BufferedReader bReader = new BufferedReader(fReader);

BufferedReader对象上的close()方法将调用Reader类的抽象close()方法,该方法最终将调用InputStreamReader类中的实现方法,然后关闭InputStream对象。

所以,只有bReader.close()就足够了。

Anup Verma answered 2019-04-23T07:13:26Z

0 votes

你只需要关闭bufferedReader,即reader.close(),它就能正常工作。

robust12 answered 2019-04-23T07:13:54Z

0 votes

从Java 7开始,您可以使用try-with-resources语句

try (BufferedReader br = new BufferedReader(new FileReader(path))) {

return br.readLine();

}

因为BufferedReader实例是在try-with-resource语句中声明的,所以无论try语句是正常还是突然完成,它都将被关闭。 因此,您无需在finally语句中自行关闭它。 (嵌套资源语句也是如此)

这是使用资源的推荐方法,有关更多详细信息,请参阅文档

Claudiu answered 2019-04-23T07:14:35Z

0 votes

我迟到了,但是:

BufferReader.java:

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;

}

}

}

Дима Гашко answered 2019-04-23T07:15:07Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值