Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我只能关闭插座';s先输出流,然后关闭输入流?_Java_Sockets_Networking - Fatal编程技术网

Java 为什么我只能关闭插座';s先输出流,然后关闭输入流?

Java 为什么我只能关闭插座';s先输出流,然后关闭输入流?,java,sockets,networking,Java,Sockets,Networking,我用InputStreamReader包装socket.getInputStream(),用OutputStreamWriter包装socket.getOutputStream()。我发现这些流的关闭顺序真的很重要,但我不知道为什么 如果我先关闭outputStream,然后再关闭inputStream,它可以正常工作: outputStreamWriter.close(); inputStreamReader.close(); 但是,如果我先关闭inputStream,然后再关闭output

我用InputStreamReader包装socket.getInputStream(),用OutputStreamWriter包装socket.getOutputStream()。我发现这些流的关闭顺序真的很重要,但我不知道为什么

如果我先关闭outputStream,然后再关闭inputStream,它可以正常工作:

outputStreamWriter.close();
inputStreamReader.close();
但是,如果我先关闭inputStream,然后再关闭outputStream,则会抛出一个错误:

inputStreamReader.close();
outputStreamWriter.close();
错误是:

java.net.SocketException: Socket closed
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:316)
    at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149)
    at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233)
    at http.HTTPServer.start(HTTPServer.java:69)
    at http.HTTPTest.main(HTTPTest.java:10)
另外,我想问,在关闭套接字的输入流和输出流之后,我是否仍然需要调用
socket.close()
?如果我先关闭套接字,我还需要关闭这两个流吗?

来自

关闭此套接字还将关闭套接字的
InputStream
OutputStream

关闭返回的
InputStream
将关闭关联的套接字

关闭返回的
OutputStream
将关闭关联的套接字

因此,您不能故意或意外地关闭一个流。如果您已经完成了套接字,那么
socket.close()
就可以了。尽管您使用的是try-with-resources,但是流可能会自动关闭。取决于您的设计如何编写逻辑


这里出现异常的原因是
OutputStreamWriter
缓冲字节,因此当您
close()
时,它首先写出其缓冲区(如果缓冲区不是空的)。如果先关闭写入程序,套接字仍处于打开状态,字节将被写入,如果您先关闭读卡器,套接字将关闭,您将得到一个异常。

文档中说
关闭此套接字也将关闭套接字的InputStream和OutputStream。
。关闭任何
FilteredOutStream
将刷新它并关闭基础流。关闭套接字输入流将关闭它和底层套接字,但不会刷新围绕套接字输出流的任何输出流或写入程序。谢谢,但是如果是这样,为什么我能够先关闭outputstream,然后关闭inputstream而不看到错误?