关闭InputStream和OutputStream

时间:2017-09-17 01:29:03

标签: java inputstream outputstream

我在这个post中读到,只要使用fileinputstream或outputstream,就会分配处理的低级文件,因此始终需要关闭io流。如果其他流(例如:ByteArrayInputStream)不处理文件或网络io,是否需要关闭流?如果是这样,为什么?

3 个答案:

答案 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 7OpenJDK 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

这是一个链接,您可以在其中阅读流并关闭它们以及它们应该关闭的原因。

希望这有帮助!