Quelle est la différence entre la fermeture de Input / OutputStream et la fermeture de Socket directement?

Je me demande simplement ce que fait Java lorsque nous appelons close sur les entréesStream et OutStream associées à un socket. Quelle est la différence avec l’appel proche sur le socket, c’est-à-dire Socket.close ().

si nous fermons simplement le stream io sur le socket, mais pas le socket, pouvons-nous rouvrir le stream io sur le socket à nouveau?

Merci d’avance!

Vous devez fermer le stream de sortie le plus externe que vous avez créé à partir du socket. Cela va le rincer. Fermer le socket ou le stream d’entrée ne fait pas cela, donc ce n’est pas adéquat. Après avoir fermé ce stream de sortie, vous n’avez rien d’autre à faire.

De la documentation java api pour Socket :

public void close () lève IOException Ferme ce socket. Tout thread actuellement bloqué dans une opération d’E / S sur ce socket lève une exception SocketException.

Une fois qu’un socket a été fermé, il n’est plus disponible pour une utilisation réseau ultérieure (c.-à-d. Qu’il ne peut pas être reconnecté ou rebondi). Un nouveau socket doit être créé.

La fermeture de ce socket fermera également les entrées InputStream et OutputStream du socket.

Si ce socket a un canal associé, le canal est également fermé.

La fermeture du stream d’entrée du socket entraînera la fermeture du socket. Il en va de même pour la fermeture du OutputStream du Socket.

De la documentation de l’API java pour Socket # getInputStream ()

La fermeture du InputStream renvoyé ferme le socket associé.

Vérifiez la documentation de l’API, elle est là pour une raison.

Cela ressemble plus à un commentaire qu’à une bonne réponse: (je préférerais append un commentaire à l’une des réponses ci-dessus mais je n’ai pas le représentant)

La question, telle que je la lis, est la suivante: “puis-je fermer un stream sur une prise, puis ouvrir un stream sur la même prise?” … mais les gens semblent répondre à cette question: “comment dois-je fermer proprement ma prise?” … qui n’est pas la question posée.

La réponse à la question posée est “non”. Lorsque vous fermez le stream, vous fermez le socket.

(Je comprends pourquoi, dans au moins un cas, quelqu’un pourrait poser cette question. Lorsque vous transmettez des propriétés Java en continu sur un socket, le destinataire doit voir EOF pour reconnaître la fin des propriétés – pour que le destinataire puisse voir EOF comme expéditeur. doit fermer le stream / socket, MAIS, si vous avez un protocole de commande / réponse fonctionnant sur ce socket, vous ne voulez PAS le fermer ou vous perdrez le canal sur lequel vous voulez envoyer une réponse. Propriétés sur Socket pour une façon de gérer cela)