Все что смог проверил - вроде результаты правильно выдает. Валидатор не пропускает.
package com.javarush.task.task19.task1918;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
Знакомство с тегами
*/
public class Solution {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
reader.close();
ArrayList<StringBuilder> strings = new ArrayList<>();
ArrayList<Boolean> opens = new ArrayList<>();
String openTag = String.format("<%s", args[0]);
String closeTag = String.format("</%s>", args[0]);
int i;
int compareTagCharNumber = 0;
int compareCloseTagCharNumber = 0;
FileReader fileReader = new FileReader(fileName);
while ((i = fileReader.read()) != -1) {
if (i != 10 && i != 13) {
for (int j = 0; j < opens.size(); j++) {
if (opens.get(j)) strings.get(j).append((char) i);
}
if ((char) i == openTag.charAt(compareTagCharNumber)) compareTagCharNumber++;
else compareTagCharNumber = 0;
if (compareTagCharNumber == openTag.length()) {
compareTagCharNumber = 0;
strings.add(new StringBuilder(openTag));
opens.add(true);
}
if ((char) i == closeTag.charAt(compareCloseTagCharNumber)) compareCloseTagCharNumber++;
else compareCloseTagCharNumber = 0;
if (compareCloseTagCharNumber == closeTag.length()) {
compareCloseTagCharNumber = 0;
for (int j = opens.size() - 1; j >= 0; j--) {
if (opens.get(j)) {
opens.set(j, false);
break;
}
}
}
}
}
fileReader.close();
for (StringBuilder stringBuilder : strings) {
System.out.println(stringBuilder.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}