Как использовать попытку с ресурсами с оператором if?

У меня есть простой код:

try (FileReader file = new FileReader(messageFilePath);
     BufferedReader reader = new BufferedReader(file)) {

    String line;
    while ((line = reader.readLine()) != null) {
        ////
    }
} 

Я хочу написать что-то вроде этого:

FileReader file = null;
///.....

try (file = (file == null ? new FileReader(messageFilePath) : file);
     BufferedReader reader = new BufferedReader(file)) {

    String line;
    while ((line = reader.readLine()) != null) {
        ////
    }
} 

Это позволило бы мне повторно использовать FileReader. Является ли это возможным? Если нет, то как правильно повторно использовать FileReader?

P.S.
Я использую Java 8, если это важно.


person Denis    schedule 24.02.2015    source источник
comment
Почему вам нужно повторно использовать FileReader? Все его линии потребляются.   -  person Sotirios Delimanolis    schedule 24.02.2015
comment
@SotiriosDelimanolis, я много раз просматриваю всю строку этого файла.   -  person Denis    schedule 24.02.2015
comment
Для этого вам понадобится новая программа для чтения файлов.   -  person Sotirios Delimanolis    schedule 24.02.2015
comment
Если FileReader используется в попытке с ресурсами, он будет автоматически закрыт после того, как вы покинете блок try. Вы уверены, что хотите использовать его повторно?   -  person Dogs    schedule 24.02.2015
comment
@Dogs, SotiriosDelimanolis, кажется, я ошибся. Я подумал, что оптимизировал код, если буду повторно использовать этот объект.   -  person Denis    schedule 24.02.2015
comment
Я не думаю, что вы можете сбросить FileReader таким образом, вам все равно понадобится новый - или для хранения строк файла в памяти.   -  person Louis Wasserman    schedule 24.02.2015
comment
@LouisWasserman, что я могу сделать, если размер всех строк больше, чем имеется доступной оперативной памяти?   -  person Denis    schedule 24.02.2015
comment
Создайте новый FileReader или аналогичный, не пытаясь повторно использовать первый.   -  person Louis Wasserman    schedule 24.02.2015
comment
Спасибо, парни. Я понял свою ошибку, я собираюсь пересмотреть свою задачу.   -  person Denis    schedule 24.02.2015


Ответы (1)


Вам всегда нужно определять новую переменную часть блока try-with-resources. Это текущее ограничение реализации в Java 7/8. В Java 9 они рассматривают возможность поддержки того, о чем вы просили изначально.

Однако вы можете использовать следующий небольшой трюк:

public static void main(String[] args) throws IOException {
    FileReader file = null;
    String messageFilePath = "";

    try (FileReader reader = file = (file == null ? new FileReader(messageFilePath) : file);
            BufferedReader bufReader = new BufferedReader(file)) {

        String line;

        while ((line = bufReader.readLine()) != null) {
            ////
        }
    }
}
person Crazyjavahacking    schedule 24.02.2015