使用隐式和显式可关联的try-with行为

时间:2014-04-27 13:30:36

标签: java stream

以下试用版块是否相似?在这两种情况下都会关闭dataSocket.getOutputStream()吗?

A)

try (Socket dataSocket = new Socket(...);
         OutputStream socketStream = dataSocket.getOutputStream();
         BufferedOutputStream outputStream = new BufferedOutputStream(socketStream)
         ) {.....}

b)中

try (Socket dataSocket = new Socket(...);
         BufferedOutputStream outputStream = new BufferedOutputStream(dataSocket.getOutputStream())
         ) {.....}

请注意。在b)中dataSocket.getOutputStream()没有明确的变量,a)我们有socketStream

2 个答案:

答案 0 :(得分:1)

根据BufferedOutputStream JavaDoc,

  

关闭此输出流并释放与该流关联的所有系统资源。

关闭outputStream将关闭基础输出流。这也在BufferedOutputStream的close()方法的源代码中得到证明。

public void close() throws IOException {
    try {
      flush();
    } catch (IOException ignored) {
    }
    out.close();
}

答案 1 :(得分:1)

是的,两种情况都会关闭。即使只使用Socket句子,它们也应该被关闭。当套接字关闭时,流将关闭。无论如何,我更喜欢明确地在试用结构上添加Streams声明。