Qual é a diferença entre fechar Input / OutputStream e fechar Socket diretamente?

Eu só estou me perguntando o que o java faz quando chamamos de perto o inputStream e outStream associados a um socket. Qual é a diferença da chamada de fechamento no soquete, ou seja, Socket.close ().

se apenas fecharmos o stream de io no soquete, mas não fecharmos o soquete, poderemos reabrir o stream de io no soquete novamente?

Desde já, obrigado!

Você deve fechar o stream de saída mais externo que você criou a partir do soquete. Isso irá liberá-lo. Fechar o soquete ou o stream de input não faz isso, portanto, não é adequado. Tendo fechado o stream de saída, você não precisa fazer mais nada.

Na documentação da API java para o Socket :

public void close () throws IOException Fecha este soquete. Qualquer thread bloqueado atualmente em uma operação de E / S nesse soquete emitirá um SocketException.

Depois que um soquete for fechado, ele não estará disponível para uso posterior da rede (ou seja, não pode ser reconectado ou rebote). Um novo soquete precisa ser criado.

Fechar este soquete também fechará o InputStream e o OutputStream do soquete.

Se esse soquete tiver um canal associado, o canal também será fechado.

Fechar o InputStream do Socket levará ao fechamento do Socket. O mesmo vale para fechar o OutputStream do Socket.

Da documentação da API java para Socket # getInputStream ()

Fechar o InputStream retornado fechará o soquete associado.

Verifique a documentação da API, ela está lá por um motivo.

Isso é mais como um comentário do que uma boa resposta: (Eu preferiria adicionar um comentário a uma das respostas acima, mas eu não tenho o representante)

A questão, como eu li, é “posso fechar um stream em um soquete e depois abrir um stream no mesmo soquete?” … mas as pessoas parecem estar respondendo isso: “como devo limpar meu soquete?” … o que não é a pergunta que está sendo feita.

A resposta para a pergunta que está sendo feita é “não”. Quando você fecha o stream, você fecha o soquete.

(Eu entendo porque, em pelo menos um caso, alguém pode fazer essa pergunta. Quando você está transmitindo Java Properties através de um socket, o receptor tem que ver o EOF para reconhecer o fim das propriedades – para o receptor ver EOF o remetente tem que fechar o stream / soquete MAS, se você tem um comando / protocolo de resposta operacional sobre esse soquete, você não quer fechá-lo ou você vai perder o canal que você deseja enviar uma resposta em. Propriedades sobre o soquete para uma maneira de lidar com isso)