не могу понять как работает алгоритм считывания. Не понятно именно это :
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());
}
}
В этой строке 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[]), то он возвращает тоже целое число, но оно уже будет представлять не сам байт, а количество считанных байт в заданный буфер...
Вывод - изучайте мат. часть!
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости