Как работает приведенный код [закрыт]

245
11 апреля 2019, 22:00

не могу понять как работает алгоритм считывания. Не понятно именно это :

while((i=fin.read())!=-1)
{
    System.out.print((char)i);
}

Как это работает? В обучалке которую разбираю я, ничего внятно не сказано. Не понятно что происходит в этих скобках (i=fin.read()). Зачем мы вообще сюда i вписываем? Мы передаём считанные байты в i? А не должно это быть написанным в {} скобках? while(fin.read()!=-1) это понятно, пока с файла считываются байты, он будет выполнять следующие действия. И вот тут второй момент. Как работает это?

System.out.print((char)i);

Что это за запись вообще? ((char)i) Что здесь происходит? Если i это считанные байты, то что тут делает char? Он преобразует байты в char? А ПОЧЕМУ ЭТО ТАК ТУПО НАПИСАНО?

import java.io.*;
public class Program {
public static void main(String[] args) {
    try(FileInputStream fin=new FileInputStream("C://SomeDir//notes.txt"))
    {
        System.out.printf("File size: %d bytes \n", fin.available());
        int i=-1;
        while((i=fin.read())!=-1){
            System.out.print((char)i);
        }   
    }
    catch(IOException ex){
        System.out.println(ex.getMessage());
    } 
}
Answer 1

В этой строке while ((i = fin.read()) != -1) происходит одновременное считывание байта в переменную i и проверка результата на неравенство -1. Это эквивалентно

int i = fin.read();
while (i != -1) {
    System.out.print((char) i);
    i = fin.read();
}

Но как по мне это не эстетично выглядит и нужно лишний раз перед циклом считывать байт. Из той же серии - можно в одной строке присвоить переменной значение и вернуть в качестве результата метода:

...
return i = 5;

По поводу System.out.print((char)i); Методы класса FIS, читающие байты, возвращают значения этих байтов в виде целочисленного значения int. Почему не byte или char? Потому что кроме самого байта нужно еще вернуть -1 когда достигнут конец стрима. Поэтому для проверки END OF FILE используют проверку на -1, а если не конец, то переводим считанное целое значение байта в byte или char, как в данном случае (видимо, читаем текстовый файл, который можно вывести в консоль посимвольно).

На будущее - когда дойдете до метода int read(byte b[]), то он возвращает тоже целое число, но оно уже будет представлять не сам байт, а количество считанных байт в заданный буфер...

Вывод - изучайте мат. часть!

READ ALSO
PriorityQueue Java не работает - не работает сортировка

PriorityQueue Java не работает - не работает сортировка

У меня почему-то не работает Priority Queue А именно - я задаю comparator и начинаю вставлять элементы - а они вставляются не по порядку :( Судя по гуглу...

229
Таг form из Spring выдает исключение

Таг form из Spring выдает исключение

При попытке использовать элемент <springform:select ("http://wwwspringframework

226
Запись файла на память телефона

Запись файла на память телефона

Я хочу чтобы файлы сохранялись в отдельной папке приложения на одном уровне с папкой DownloadsSd карты нет

234
Не получается мапить фильтр

Не получается мапить фильтр

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

201