InputStream cierra y problemas de sonda

Tengo el siguiente código para abrir un archivo zip que contiene varios archivos y extrae información de cada archivo:

public static void unzipFile(InputStream zippedFile) throws IOException {
  try (ZipInputStream zipInputStream = new ZipInputStream(zippedFile)) {
    for (ZipEntry zipEntry = zipInputStream.getNextEntry(); zipEntry != null; zipEntry = zipInputStream.getNextEntry()) {
      BufferedReader reader = new BufferedReader(new InputStreamReader(new BoundedInputStream(zipInputStream, 1024)));
      //Extract info procedure...
    } 
  }
}

En resumen, elijo cada archivo del zip y lo abro con un BufferedReaderpara leer la información. También estoy usando BoundedInputStream( org.apache.commons.io.input.BoundedInputStream) para limitar el tamaño del búfer y evitar grandes líneas no deseadas en los archivos.

Funciona como se esperaba, sin embargo, recibo esta advertencia en Sonar:

Use try-with-resources or close this "BufferedReader" in a "finally" clause.

Simplemente no puedo cerrar (o usar try-with-resources , como lo hice al comienzo del método) los BufferedReaders que creo; si llamo al método close, ZipInputStreamse cerrará. Y el ZipInputStreamya está bajo prueba con recursos ...

Esta notificación de sonda está marcada como crítica, pero creo que es un falso positivo. Me pregunto si podrías aclararme algo: ¿estoy en lo cierto o debería manejar esto de una manera diferente? No quiero dejar fugas de recursos en el código, ya que este método se llamará varias veces y una fuga podría causar un daño grave.

Respuesta 1

La notificación del sonar es correcta porque técnicamente hay una fuga de recursos que podría consumir recursos con el tiempo (ver recolección de basura y clases de E / S). Para evitar cerrar el subyacente ZipInputStream, considere pasar el ZipEntryen el BoundedInputStreambucle for según esta pregunta SO: leer archivos en un archivo zip. Por lo tanto, cuando el BufferedReaderestá cerrado, el BoundedInputStreamestá cerrado y no el ZipInputStream.

Respuesta: 2

Tengo un problema de N + 1, y me gustaría escribir algún tipo de prueba de regresión automatizada porque afecta mucho el rendimiento. Pensé en espiar el EntityManager y verificar su método ...

Estoy buscando una manera de implementar un evento de temporizador en Java SE 1.7, no quiero usar temporizadores Swing ya que tengo planes de portar esta aplicación a Android. Antecedentes Estoy escribiendo una clase LoginSession ...

Estoy tratando de mostrar solo uno por dos campos que son obligatorios. En este momento hay dos mensajes de error si ambos campos están vacíos. Quiero lograr que solo haya un mensaje si ambos o solo ...

Estoy usando la cuadrícula GXT con paginación local (http://www.sencha.com/examples-2/#localpaging). Puedo obtener 2000 registros de la base de datos y todos estarán en la memoria y solo se mostrarán los registros de la primera página ...