Что делает это условие (BufferredReader и InputStreamReader)?


В данный момент я читаю код и нашел метод, начинающийся так:

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));  

String userInput;

while ((userInput = stdIn.readLine()) != null) {

  }

Может ли кто-нибудь объяснить мне это условие ? Что А = Б != с мне кажется странным.

4 2

4 ответа:

Кажется, что ваши глаза смотрят на пару скобок:

while ( (userInput = stdIn.readLine() ) != null) {

}
Я попытался сделать это более ясным выше.

Переменная userInput присваивается stdIn.readLine(). И хотя userInput не является нулем после этого назначения, цикл продолжается.

Это всего лишь один лайнер для обработки обновления userInput, а также проверки null

Присваивание в скобках (userInput = stdIn.readLine()) делает сразу две вещи: он присваивает строку переменной userInputи оценивает себя до этого значения. Но если ничего не было прочитано, то readLine() возвращает null, а целое выражение вычисляется как null.

Таким образом, пока в пользовательском вводе есть строки, условие (userInput = stdIn.readLine() ) != null выполняется, и цикл while продолжается. Когда в пользовательском вводе больше нет строк, условие ложно, и цикл while останавливается.

= является оператором присваивания, а не оператором сравнения.

(a = b) != c присваивает b Значение a, а затем сравнивает его с c.

В случае

while ((userInput = stdIn.readLine()) != null) { ... }

stdIn.readLine() получает значение, которое затем сохраняется как userInput, и это значение проверяется, чтобы убедиться, что оно не null для выполнения цикла while. Это приводит к циклу чтения каждой строки файла, пока он не закончится строк для чтения.

Это что-то вроде:

int a = 0;
int b = 0;

while ((a = b++) != 10) {

    System.out.println(a);

};  
Здесь мы присваиваем a с шагом b и проверяем, равно ли его значение 10 или нет.

Таким же образом, userInput = stdIn.readLine() означает, что мы читаем строку, присваиваем ее переменной userInput и проверяем, пока она не прочитает null.