2012-08-30 19 views
6

Este fragmento de código está creando problemas de pérdida de memoria a causa de BufferedReader y InputStreamReader que creo que puede estar ocurriendo debido a algunas excepciones. ¿Cómo debería cambiarlo?Cierre BufferedReader y InputStreamReader

try{ 
    URL url = new URL(sMyUrl); 
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
    while ((str = in.readLine()) != null) { 
     jsonString += str; 
    } 
    in.close(); 
}catch(Exception e){ 

} 
+1

Se puede mover close() para bloquear la lógica finalmente? ¿Estás seguro de que no ocurren excepciones mientras lees (o cierras) la conexión? – kosa

+0

¿Has intentado escribir 'e.printStackTrace()' en tu cláusula catch para ver si se lanzaron excepciones? –

Respuesta

12

Sería más seguro para cerrar el flujo usando un bloque try..finally. También puede usar un StringBuilder ya que está diseñado para concatenar cadenas. También debe evitar atrapar Exception y no hacer nada con él. Además, su código es concatenar líneas sin saltos de línea. Esto bien puede no ser lo que quieres, en cuyo caso append("\n") cuando se lee cada línea en

Aquí hay una versión con esas modificaciones:.

StringBuilder json = new StringBuilder(); 
try { 
    URL url = new URL(sMyUrl); 
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
    try { 
     String str; 
     while ((str = in.readLine()) != null) { 
      json.append(str).append("\n"); 
     } 
    } finally { 
     in.close(); 
    } 
} catch (Exception e) { 
    throw new RuntimeException("Failed to read JSON from stream", e); 
} 
+0

¿Debo cerrar InputStreamReader? ¿O está cerrado como lector de Buffer y creará un nuevo objeto? –

+4

No es necesario cerrar explícitamente el 'InputStreamReader' ya que se cerrará automáticamente cuando cierre el' BufferedReader'. –

+0

@aetheria, gracias. De todos modos, necesito un buen tutorial de secuencias de Java. –

5

El código no es bonito, pero no creará una pérdida de memoria. Sugiero que use un generador de perfiles de memoria para determinar dónde se está utilizando su memoria. De lo contrario se acaba de adivinar, incluso si tiene diez años de experiencia + optimización del rendimiento en Java;)

Una mejor alternativa es el uso de Java 7

URL url = new URL(sMyUrl); 
try(BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { 
    while ((str = in.readLine()) != null) { 
    jsonString.append(str).append("\n"); 
    } 
} 

Si tiene Java 6 o más que puede utilizar.

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { 
try { 
    while ((str = in.readLine()) != null) { 
    jsonString.append(str).append("\n"); 
    } 
} finally { 
    in.close(); 
} 
+0

No hay ningún beneficio en establecer 'in = null' y luego verificar null en el bloque' finally'. Simplemente ponga el 'try' inmediatamente después de construir el' BufferedReader'. –

+0

¡Gracias! ¿Debo cerrar InputStreamReader? –

+0

@aetheria Buen punto. Fijación. –

Cuestiones relacionadas