Как предотвратить закрытие BufferedReader при попытке с ресурсами из lines() (Stream‹String›)?

Это то, что я делаю, чтобы предотвратить закрытие BufferedReader, когда lines() заканчивается в try-with-resources:

Это общая утилита, и она работает со многими устройствами чтения, а не только с файлами.

public static List<String> getLines(Reader reader, boolean trim, boolean closeReader) throws IOException {
        Objects.requireNonNull(reader);
        BufferedReader br = new BufferedReader(reader) {

            @Override
            public void close() throws IOException {
                if (closeReader) {
                    super.close();
                }
            }

        };

        try (Stream<String> lines = br.lines()) {
            return lines.map(it -> trim ? it.trim() : it)
                    .collect(Collectors.toList());
        }
    }

Есть ли лучший способ управления, чтобы закрытие Stream<String> не закрывало также Bufferedreader?

Согласно комментариям ниже, чтобы попробовать обычный try, это будет выглядеть так:

public static List<String> getLines(Reader reader, boolean trim, boolean closeReader) throws IOException {
    Objects.requireNonNull(reader);
    BufferedReader br = new BufferedReader(reader);

    try {
        return br.lines()
                .map(it -> trim ? it.trim() : it)
                .collect(Collectors.toList());
    } finally {
        if (closeReader) {
            br.close();
        }
    }
}

Так лучше :)


person The Coordinator    schedule 02.12.2013    source источник
comment
Не используйте ресурсы try-with; используйте обычную попытку.   -  person MultiplyByZer0    schedule 02.12.2013
comment
Я думаю, что лучше всего не использовать попытку с ресурсами, но проверили ли вы значение closeReader.   -  person tjg184    schedule 02.12.2013
comment
Спасибо. Я попробую это.   -  person The Coordinator    schedule 02.12.2013


Ответы (2)


Я не думаю, что то, что вы описываете, возможно. Ваша попытка с ресурсами просто закрывает lines, не br. Сам lines закрывает br; и невозможно закрыть lines, не закрыв br.

Более того, я не понимаю, почему вы хотите не закрывать br. Вы читаете до конца читалки (выполняя collect); какой смысл держать его открытым после этого?

person ruakh    schedule 02.12.2013
comment
Я согласен. Однако я думал, что где-то у меня есть несколько методов, где программа чтения (специальная программа чтения) все еще должна быть открыта. Придется поискать, где найти... Похоже, я могу избавиться от параметра close! Но это все еще хороший вопрос, чтобы понять, что происходит с autocloseable и как его обойти :) - person The Coordinator; 02.12.2013

Вам не нужно закрывать поток, если вам не нужно закрывать базовый ресурс.

Большинство потоков (например, указывающие на коллекции в памяти) вообще не нуждаются в закрытии.

БОЛЬШЕ, поток, возвращенный BufferedReader.lines(), не закроет BufferedReader, если он закрыт! (в b119) Вместо этого используйте Files.lines().

person Aleksandr Dubinsky    schedule 18.12.2013