¿Cuál es la diferencia entre cerrar Input / OutputStream y cerrar Socket directamente?

Me pregunto qué hace java cuando llamamos close en el inputStream y outStream asociado a un socket. Cuál es la diferencia de la llamada cercana en el socket, es decir, Socket.close ().

si simplemente cerramos la secuencia io en el socket, pero no cerramos el socket, ¿podemos volver a abrir la secuencia io en el socket nuevamente?

¡Gracias por adelantado!

Debe cerrar la secuencia de salida más externa que ha creado desde el socket. Eso lo vaciará. Cerrar el socket o el flujo de entrada no hace eso, por lo que no es adecuado. Habiendo cerrado ese flujo de salida, no necesita hacer nada más.

De la documentación de java api para Socket :

public void close () throws IOException Cierra este socket. Cualquier hilo actualmente bloqueado en una operación de E / S sobre este socket arrojará una SocketException.

Una vez que se cierra un socket, no está disponible para un uso posterior de la red (es decir, no se puede volver a conectar o rebotar). Se necesita crear un nuevo socket.

Al cerrar este zócalo también se cerrarán InputStream y OutputStream del zócalo.

Si este socket tiene un canal asociado, entonces el canal también se cierra.

Cerrar el InputStream del Socket conducirá al cierre del Socket. Lo mismo ocurre con el cierre del OutputStream del zócalo.

De la documentación de java api para Socket # getInputStream ()

Al cerrar el InputStream devuelto, se cerrará el socket asociado.

Verifique la documentación de la API, está allí por una razón.

Esto es más como un comentario que una buena respuesta: (Preferiría agregar un comentario a una de las respuestas anteriores, pero no tengo el representante)

La pregunta, mientras la leo, es “¿puedo cerrar una secuencia en un socket y luego abrir una secuencia en el mismo socket?” … pero la gente parece estar respondiendo a esto: “¿cómo debería cerrar mi socket?” … que no es la pregunta que se hace.

La respuesta a la pregunta que se hace es “no”. Cuando cierra la secuencia, cierra el socket.

(Entiendo por qué, en al menos un caso, alguien puede hacer esta pregunta. Cuando está transmitiendo propiedades Java sobre un socket, el receptor debe ver EOF para reconocer el final de las propiedades, para que el receptor vea EOF al remitente tiene que cerrar el flujo / socket. PERO, si tiene un protocolo de comando / respuesta operando sobre ese socket, NO quiere cerrarlo o perderá el canal en el que desea enviar una respuesta. Consulte la transmisión de Java Propiedades sobre Socket para una forma de manejar esto)