Quando si utilizza HttpURLConnection, l'InputStream deve essere chiuso se non viene "ricevuto" e utilizzato?Uso sicuro di HttpURLConnection
cioè è sicuro?
HttpURLConnection conn = (HttpURLConnection) uri.getURI().toURL().openConnection();
conn.connect();
// check for content type I don't care about
if (conn.getContentType.equals("image/gif") return;
// get stream and read from it
InputStream is = conn.getInputStream();
try {
// read from is
} finally {
is.close();
}
In secondo luogo, è sicuro di chiudere un InputStream prima di tutto il suo contenuto è stato completamente leggere?
C'è il rischio di lasciare il socket sottostante in stato ESTABLISHED o anche CLOSE_WAIT?
Molto interessante. Questa domanda è in realtà lo sfondo per un problema che ho dove vedo LOTTI di socket CLOSE_WAIT sullo stesso IP, ma a causa del caching (non richiamo esplicitamente URLConnection.disconnect(), mi aspetto che ci sia solo uno, che dovrebbe essere riutilizzato – Joel
@Joel: chiamando 'HttpUrlConnection.disconnect()' il socket tcp sottostante viene chiuso. Chiudendo il flusso di input, il socket tcp sottostante viene riunito per un successivo riutilizzo.L'unica avvertenza è che l'intera risposta (OPPURE l'intera risposta all'errore) dovrebbe essere letta dal flusso di input affinché la connessione tcp sia memorizzata nella cache. Questo è sempre stato consigliato indipendentemente dal fatto che tu abbia effettivamente bisogno dell'intero dato dal flusso. Controllare la posta nella mia risposta – Cratylus
Che cosa succede se non avete letto tutti i dati, come per il mio primo esempio - sto indovinare ancora necessario chiudere la IS, ma sarà non ancora essere memorizzato nella cache, se non i dati vengono letti ma è ancora chiuso. – Joel