Объединение блоков Try-Catch в один (Java)
Мне необходимо прочесть файл (путь к файлу вводится через командную строку), в котором представлена структура папки в виде "дерева". С помощью фильтра нужно найти количество внутренних папок и файлов, среднее количество файлов в папке и тд. Написал следующий рабочий, но громоздкий код.
public class ReadFile {
public static void main(String[] args) {
File file = new File(args[0]);
if (file.exists() && file.isFile()) {
long numberOfDirs = 0;
try (FileReader reader = new FileReader(args[0]);
BufferedReader bufferedReader = new BufferedReader(reader)) {
numberOfDirs = bufferedReader.lines()
.filter(line -> line.startsWith("|-"))
.count();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(numberOfDirs + " dirs");
double numberOfFiles = 0;
try (FileReader reader = new FileReader(args[0]);
BufferedReader bufferedReader = new BufferedReader(reader)) {
numberOfFiles = bufferedReader.lines()
.filter(line -> line.startsWith("|\t"))
.count();
int result = (int) Math.round(numberOfFiles);
System.out.println(result + " files");
} catch (IOException e) {
e.printStackTrace();
}
try (FileReader reader = new FileReader(args[0]);
BufferedReader bufferedReader = new BufferedReader(reader)) {
double averageLength = bufferedReader.lines()
.filter(line -> line.endsWith(".mp3"))
.mapToInt(String::length)
.average()
.getAsDouble();
System.out.println("Average file length = " + averageLength);
} catch (IOException e) {
e.printStackTrace();
}
double averageNumberOfFiles = numberOfFiles / numberOfDirs;
System.out.format("%.1f", averageNumberOfFiles);
}
}
}
Можно ли все вычисления вобрать в один блок Try-Catch, чтобы не запускать каждый раз BufferedReader? У самого не получилось, я начинающий. Буду признателен за помощь или подсказку.
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Приблизительно так можно прочитать файл раз в список, и потом уже использовать многократно:
List<String> lines;
try (FileReader reader = new FileReader(args[0]);
BufferedReader bufferedReader = new BufferedReader(reader)) {
lines = bufferedReader.lines().collectTo(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
long numberOfDirs = lines.stream()
.filter(line -> line.startsWith("|-"))
.count();
System.out.println(numberOfDirs + " dirs");
double numberOfFiles = lines.stream()
.filter(line -> line.startsWith("|\t"))
.count();
int result = (int) Math.round(numberOfFiles);
System.out.println(result + " files");
double averageLength = lines.stream()
.filter(line -> line.endsWith(".mp3"))
.mapToInt(String::length)
.average()
.getAsDouble();
System.out.println("Average file length = " + averageLength);
double averageNumberOfFiles = numberOfFiles / numberOfDirs;
System.out.format("%.1f", averageNumberOfFiles);