Объясните то, что я не понимаю и то, что я понимаю неверно следующим образом : "В строке номер n ты понял не правильно. Правильно будет вот так вот так..." Спасибо заранее. PS В начале все более менее понятно, в конце начинается лютый хаос
public class Solution {
    public static void main(String[] args) throws IOException {
        StringBuilder readFileContent = new StringBuilder();//создаем заполняемое поле для хранения данных html файла

        try(BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fileReader = new BufferedReader(new FileReader(consoleReader.readLine()))) {//вводим имя html файла, который нужно читать

            while (fileReader.ready()) {//выполнять следующее, пока файлРидер не прочитает файл полностью
                readFileContent = readFileContent.append(fileReader.readLine());//циклами заполняем данными дополняемое поле
            }
        }

        String fileContent = readFileContent.toString().replaceAll("\r\n", "");//перемещаем все данные из стрингБафера в стринг без переносов строки

        String openTag = "<" + args[0];//обозначаем внешний вид тега-открытия
        String closingTag = "</" + args[0];//обозначаем внешний вид тега-закрытия
        int tagLength = args[0].length();//обозначаем длину тега
        int startTagIndex = 0;//обозначаем индекс начала тега, который будет в дальнейшем изменяться
        int endTagIndex = 0;//обозначаем индекс конца тега, который будет в дальнейшем изменяться

        ArrayList<String> tags = new ArrayList<>();//создаем список для хранения тегов

        while ((startTagIndex != -1) && (startTagIndex < fileContent.length())) {//выполнять следующее, пока индекс начала строки не равен -1(пока существует)
            startTagIndex = fileContent.indexOf(openTag, startTagIndex);//обозначаем первичные координаты тега-открытия
            endTagIndex = fileContent.indexOf(closingTag, startTagIndex + tagLength);//обозначаем первичные координаты тега-закрытия

            int indexInTag = startTagIndex + tagLength;//создаем виртуальный курсор и переставляем его в место конца уже обработанных данных и в начало еще не обработанных
            if (endTagIndex != -1) {//если теги-закрытия еще есть(или есть необработанные теги-закрытия), выполняем следующее
                while (fileContent.substring(indexInTag, endTagIndex).contains(openTag)) {//пока в обозреваемой области(от нашего виртуального курсора до индекса окончания тега) строки есть тег-открытие, выполняем следующее
                    indexInTag = endTagIndex + tagLength;//перемещаем виртуальный курсор в место по индексу окончания тега-закрытия
                    endTagIndex = fileContent.indexOf(closingTag, indexInTag);//ни хрена не пойму что тут делается
                }
            }
            if (startTagIndex != -1 && endTagIndex !=-1) {//выполнять следующее, если есть стартовый тег и есть конечный тег
                tags.add(fileContent.substring(startTagIndex, endTagIndex + tagLength + 3));//как я понимаю , записываем в список строки от индекса начала тега до индекса конца тега и хрен пойми зачем прибавляем к этому 3
                startTagIndex += tagLength;//изменяем индекс начала, чтобы, как я понимаю, не обрабатывать одно и то же поле
            }
        }
        for (String tag : tags) {
            System.out.println(tag);
        }
    }
}