我在这个post中读到,只要使用fileinputstream或outputstream,就会分配处理的低级文件,因此始终需要关闭io流。如果其他流(例如:ByteArrayInputStream)不处理文件或网络io,是否需要关闭流?如果是这样,为什么?
答案 0 :(得分:4)
您通常必须明确(static fileprivate func makeNetworkRequest<T: Decodable>(url: URL, type: T.Type, completionHandler: @escaping (_ error: Error?, _ myObject: T?) -> ()) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(T.self, from: data!)
completionHandler(nil, myNewObject)
} catch let error {
completionHandler(error, nil)
return
}
}.resume()
}
)或使用try-with-resources关闭 Streams,如您引用的帖子或javapractices.com上的文章中所述@ SassyRegards201引用。
如果你严肃对待你的编程,那么就没有“它通常无效”。唯一可以在不关闭流的情况下离开的方法是,明确记录,具体实施不需要关闭(与ByteArrayInputStream of Oracle JDK 7和OpenJDK code中一样)和您确定只使用此实现。更改JDK的版本或供应商可能会使您的假设无效!
问题是你应该针对接口进行编程。并且由于所有流都实现了Stream.close()
接口,该接口定义了Closeable
方法(旨在调用以释放资源),实现可能会以某种方式可能需要进行更改你称之为close方法。
关闭每个流费用不高(性能和开发时间),只是良好做法,现在通过错误查找软件进行检查
答案 1 :(得分:2)
我在这篇文章中读到,只要使用fileinputstream或outputstream,就会分配处理的低级文件,因此总是需要关闭io流。
文件输入或输出流是。其他网络流也必须关闭,因为它们有文件描述符。
如果其他流(例如:ByteArrayInputStream)不处理文件或网络io,是否需要关闭流?如果是这样,为什么?
是否有必要,不,但它确实是一种很好的做法。如果您查看close()
和ByteArrayInputStream
中的ByteArrayOutputStream
方法,就可以看到它是一个无操作:
public void close() throws IOException {
}
在实践方面,如果您养成了总是关闭流的习惯,那么如果您稍后切换使用不同的流,则会更好。我们将代码和模式从代码中的一个位置复制到其他位置,以便做正确的事情并关闭每个流可能会有所帮助。
在Java 7+中,您可以使用try with resources来自动关闭流:
try (OutputStream stream = new ByteArrayOutputStream()) {
...
}
或者你可以使用try / finally:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
...
} finally {
baos.close();
}
byte[] bytes = baos.toByteArray();
...
答案 2 :(得分:0)
这不是绝对必要的,但它是一种首选的做法,就像java中的很多东西一样。
http://www.javapractices.com/topic/TopicAction.do?Id=8
这是一个链接,您可以在其中阅读流并关闭它们以及它们应该关闭的原因。
希望这有帮助!