Создание списка BufferedReaders - PullRequest
       8

Создание списка BufferedReaders

1 голос
/ 27 августа 2011

Я хотел бы иметь метод, который возвращает список BufferedReader объектов (например, для всех файлов в каталоге):

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;
}

Это будет большая трата ресурсов?

Будут ли все эти потоки открыты в момент создания и останутся ли они, следовательно, удерживая системные ресурсы?

Если да, могу ли я создать эти читатели в «пассивном» режиме без фактического открытия потоков, или есть какой-то другой обходной путь (чтобы я мог безопасно создать список с тысячами читателей)?

Ответы [ 3 ]

1 голос
/ 27 августа 2011

Я уверен, что это плохая идея.Вы рискуете использовать все доступные файловые дескрипторы, и нет смысла открывать читатель для файла, если вы не хотите читать из него.

Если вы хотите прочитать из файла, откройте программу чтения, прочитайте файл и закройте программу чтения.Затем сделайте то же самое для следующего файла для чтения.

Если вы хотите, чтобы уникальная абстракция считывалась из различных источников (URL-адреса, файлы и т. Д.), То создайте собственный интерфейс Source и несколькореализации, которые обертывают ресурс для чтения (URLSource, FileSource и т. д.).Открывайте реальный читатель на упакованном ресурсе только при чтении из вашего экземпляра Source.

1 голос
/ 27 августа 2011

да, эти потоки будут открыты, как только они будут созданы

Хороший способ избежать этого - создать класс LazyReader, который инициализирует Reader только при первом чтении

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()

}
1 голос
/ 27 августа 2011

Да, конструктор для FileInputStream вызывает open() в своем конструкторе. open() - это собственный метод, который, скорее всего, зарезервирует дескриптор файла для файла.

Вместо немедленного возврата списка BufferedReaders, почему бы не вернуть список чего-либо, что при необходимости откроет основной поток? Вы можете создать класс, который содержит имя файла и просто открыть ресурс при вызове.

...