Java 关闭ObjectInputStream和ObjectOutputStream的正确方法

Java 关闭ObjectInputStream和ObjectOutputStream的正确方法,java,serialization,deserialization,objectinputstream,objectoutputstream,Java,Serialization,Deserialization,Objectinputstream,Objectoutputstream,我试图创建一个类,在其中可以序列化和反序列化对象。该类应该以这种方式工作:我序列化对象并将其发送到服务器,然后服务器将修改对象的一个字段并将其发送回,以便我可以反序列化接收到的对象。但是如果我关闭输出流,我会得到一个套接字写入错误。如何正确关闭OutputStream和InputStream 编辑: 即使我使用try-with-resources,我仍然会得到相同的错误 代码: 这是我得到的例外,它位于服务器端: java.net.SocketException: Software caused

我试图创建一个类,在其中可以序列化和反序列化对象。该类应该以这种方式工作:我序列化对象并将其发送到服务器,然后服务器将修改对象的一个字段并将其发送回,以便我可以反序列化接收到的对象。但是如果我关闭
输出流
,我会得到一个套接字写入错误。如何正确关闭
OutputStream
InputStream

编辑: 即使我使用try-with-resources,我仍然会得到相同的错误

代码:

这是我得到的例外,它位于服务器端:

java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at ro.unitbv.serverinvoicemanagement.classes.ServerThread.run(ServerThread.java:29)
at java.lang.Thread.run(Unknown Source)

您可以尝试将其放在finally块中:

public void deSerializeObject() {
    ObjectInputStream clientInputStream = null;

    try {
        clientInputStream = new ObjectInputStream(socketConnection.getInputStream());
        OrdinaryUser user = (OrdinaryUser) clientInputStream.readObject();
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        clientInputStream.close();
    }

}
但是如果我关闭outputStream,就会出现套接字写入错误

你为什么要这么做

在这里:

ObjectOutputStream clientOutputStream = new ObjectOutputStream(socketConnection.getOutputStream());
clientOutputStream
变量引用套接字的outputstream。
如果您关闭它,则关闭插座。

这里也是一样:

ObjectInputStream clientInputStream = new ObjectInputStream(socketConnection.getInputStream());
clientInputStream
变量引用套接字的inputstream。
如果你关闭它,你就关闭了插座

虽然在读/写时需要套接字,但您不必关闭与之关联的流。

否则,套接字将不再处于可用状态,并且套接字上的读/写操作将失败。

正确的方法是您确定需要
close()
而不仅仅是
flush()
来避免关闭底层流吗?他需要先刷新,然后关闭流。这只是一个安全的做法,我尝试使用try和资源,但我仍然得到相同的错误。我没有明确地关闭流,因为我知道在try-with-resources中,它会自动关闭。您能提供您拥有的确切堆栈跟踪吗?但是当我完成读/写时,如何关闭流?
ObjectInputStream clientInputStream = new ObjectInputStream(socketConnection.getInputStream());