Creación de una lista de lectores almacenados en búfer

Me gustaría tener un método que devuelva una lista de BufferedReader objetos (por ejemplo, para todos los archivos de un directorio):

private List<BufferedReader> getInputReaders(List<String> filenames) {
    List<BufferedReader> result = new ArrayList<BufferedReader>();
    for(String filename : filenames)
        result.add(new BufferedReader(new InputStreamReader(new FileInputStream(filename), "UTF-8")));
    }
    return result;
}

¿Será esto un gran desperdicio de recursos?

¿Se abrirán todas esas corrientes en el momento de la creación y permanecerán así conteniendo los recursos del sistema?

En caso afirmativo, ¿puedo crear esos lectores en modo "pasivo" sin abrir realmente los flujos, o hay alguna otra solución (para poder crear una lista con miles de lectores de forma segura)?

preguntado el 27 de agosto de 11 a las 16:08

¿Por qué no crea los lectores cuando los necesita? -

@Kevin Simplifiqué la tarea, tendré que lidiar con nombres de archivo mezclados con URL mezcladas con directorios con filtros de nombre de archivo, etc. Me gustaría ocultar todo esto en un método separado y tener solo una lista de lectores al final. -

¿Puede "ocultar" la URL mixta en una clase y dársela a una fábrica o alguna otra clase que devuelva una instancia de lector adecuada? -

@Kevin Puedo, pero me gustaría ver si puedo salir con una lista de lectores primero, ya que sería una solución más simple para mí. -

3 Respuestas

Sí, el constructor de FileInputStream invoca open() en su constructor. open() es un método nativo, que probablemente reservará un descriptor de archivo para el archivo.

En lugar de devolver inmediatamente una lista de BufferedReaders, ¿por qué no devolver una lista de algo que abrirá el flujo subyacente según sea necesario? Puede crear una clase que se aferre a un nombre de archivo y simplemente abrir el recurso cuando se le llame.

Respondido 27 ago 11, 20:08

Estoy bastante seguro de que es una mala idea. Corre el riesgo de consumir todos los descriptores de archivo disponibles, y no tiene sentido abrir un lector a un archivo si no desea leerlo.

Si desea leer desde el archivo, abra un lector, lea desde el archivo y cierre el lector. Luego, haga lo mismo con el siguiente archivo para leer.

Si desea que una abstracción única lea de varias fuentes (URL, archivos, etc.), cree la suya propia. Source interfaz y múltiples implementaciones que envolverían el recurso para leer desde (URLSource, FileSource, etc.). Solo abra el lector real en el recurso envuelto cuando lea de su Source ejemplo.

Respondido 27 ago 11, 20:08

sí, esas transmisiones se abrirán tan pronto como se creen

Una buena forma de evitar esto es crear una clase LazyReader que solo inicialice el Reader en la primera lectura

public class LazyReader extends Reader{

    String fileName;
    Reader reader=null;
    public LazyReader(String filename){
        super();
        this.fileName=fileName;
    }

    private void init(){
       if(reader==null)
           reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename), "UTF-8"));
    }

    public int read(char[] cbuf, int off, int len){
        init();
        return reader.read(cbuff, off,len);
    }

    public int close(){
        init();
        reader.close();
    }

    //if you want marking you should also implement mark(int), reset() and markSupported()

}

Respondido 27 ago 11, 20:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.