Java 尝试使用隐式和显式可关闭项的行为

Java 尝试使用隐式和显式可关闭项的行为,java,stream,Java,Stream,以下试块是否相似?在这两种情况下,dataSocket.getOutputStream()是否都会关闭 (a) (b) 注意。在b)中,dataSocket.getOutputStream()没有显式变量,在a)中我们有socketStream 根据BufferedOutputStreamJavaDoc 关闭此输出流并释放与该流关联的所有系统资源 关闭outputStream将关闭底层outputStream。BufferedOutputStream的close()方法的源代码也证明了这一点 是

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

(a)

(b)


注意。在b)中,
dataSocket.getOutputStream()
没有显式变量,在a)中我们有
socketStream

根据
BufferedOutputStream
JavaDoc

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

关闭
outputStream
将关闭底层outputStream。
BufferedOutputStream
的close()方法的源代码也证明了这一点


是的,在这两种情况下都将关闭。即使只使用套接字语句,它们也应该关闭。套接字关闭时,流将关闭。无论如何,我更喜欢在try with structure上显式地添加流声明

try (Socket dataSocket = new Socket(...);
         OutputStream socketStream = dataSocket.getOutputStream();
         BufferedOutputStream outputStream = new BufferedOutputStream(socketStream)
         ) {.....}
try (Socket dataSocket = new Socket(...);
         BufferedOutputStream outputStream = new BufferedOutputStream(dataSocket.getOutputStream())
         ) {.....}
public void close() throws IOException {
    try {
      flush();
    } catch (IOException ignored) {
    }
    out.close();
}