Коллеги, уже неделю мучаю, вроде бы, простую задачку. Переписывал уже три раза с нуля, используя разную логику решения.
package com.javarush.task.task31.task3101;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/*
Проход по дереву файлов
*/
public class Solution {
public static void main(String[] args) {
String path = args[0]; // получаем на вход путь исследуемой доректории
String resultFileAbsolutePath = args[1]; // получаем имя существующего файла для результата
File inputFile = new File(resultFileAbsolutePath); // создаем объект файла переданного в метод
File resultFile = new File(inputFile.getParent() + "\\allFilesContent.txt"); // создаем объект файла результата
ArrayList<String[]> listFiles = new ArrayList<String[]>(); // заводим переменную для хранения списка файлов
// внутри списка хнанится список файлов где в 0 индексе записано имя файла, а в 1 полный путь к файлу
Solution example = new Solution(); // создаем экземпляр нашего класса
example.getAllDirs(path, listFiles); // вызываем метод анализа директорий по указанному пути
example.sortFiles(listFiles); // вызываем метод сортировки списка файлов по именам файлов по возрастанию
example.saveAllFiles(resultFile, listFiles); // вызываем метод записи файлов по отсортированному списке в результативный файл
}
private void getAllDirs(String path, ArrayList<String[]> listFiles) // метод принимает на вход путь поиска файлов и список файлов
{
File mainFolder = new File(path); // создаем объект начальной директории
File[] listObj = mainFolder.listFiles(); // получаес список всех файлов в заданной директории
if (listObj != null) // работаем со списком только если он существует (директория не пуста)
// избезая тем самым NullPointerException появляющийся в runtime
{
for (File obj : listObj) // циклом проходим по всем файлам в заданной директории
{
if (obj.isDirectory()) // если текущий файл является директорией
{
getAllDirs(obj.getAbsolutePath(), listFiles); // вызываем рекурсивно метод и передаем в него текущий путь к директории и список файлов
}
if (obj.isFile()) // если текущий объект является файлом
{
if (obj.length() <= 50) // если длинна (размер) файла не более 50 байт
{
String[] newFile = new String[2]; // создаем контейнер для хранения данных файла
newFile[0] = obj.getName(); // в первую ячейку заносим имя текущего файла
newFile[1] = obj.getAbsolutePath(); // во вторую ячейку заносим полный путь к файлу
listFiles.add(newFile); // добавляем в список файлов текущую запись о файле
}
else // иначе файл нам не подходит
{
FileUtils.deleteFile(obj); // удаляем файл
}
}
}
}
}
private void sortFiles(ArrayList<String[]> listFiles) // метод сортирует список по именам файлов
{
int cnt = listFiles.size(); // заводим счетчик из длинны списка для циклов сортировки
while (cnt > 0) // внешний цикл сортировки
{
for (int i = 0; i < listFiles.size() - 1; i++) // внутренний цикл сортировки
{
String[] a = listFiles.get(i); // получаем список по текущему значению
String[] b = listFiles.get(i + 1); // получаем список по слеющему значению
if (a[0].compareTo(b[0]) > 0) // если значение имени файла на текущем значении в цикле больше значения имени файла на слудующем значении в цикле
// меняем их местами
{
listFiles.set(i, b);
listFiles.set(i + 1, a);
}
}
cnt--; // уменьшаем счетчик внешнего цикла
}
}
private void saveAllFiles(File file, ArrayList<String[]> listFiles) // метод по отсортированному списку файлов записывает все файлы в одим общий файл
{
try {
FileOutputStream writer = new FileOutputStream(file); // создаем поток записи в файл результата
// нужно проверить не попал ли результативный файл в список записи, чтобы избежать зацикливания
for (String[] pair : listFiles)
{
if (file.getAbsolutePath().equals(pair[1])) // если в списке файлов для записи попался и файл в который нужно записывать
{
continue; // пропускаем эту итерацию цикла
}
FileInputStream reader = new FileInputStream(pair[1]); // создаем поток чтения из файла
while (reader.available() > 0) // читаем файл пока в нем есть непрочитанные данные
{
byte[] buff = new byte[reader.available()]; // создаем буфер чтения размером количества байт в файле
reader.read(buff); // читаем все байты из файла в буфер, результат чтения игнорируем (результат чтения это int число количества проситанных байт)
writer.write(buff); // записываем данные из буфера в поток записи
}
reader.close(); // закрываем поток чтения
writer.write("\n".getBytes()); // после тела записанного файла добавляем символ новой строки
}
writer.close(); // закрываем поток записи в файл
}
catch (FileNotFoundException e)
{
System.out.println("File not found");
}
catch (IOException e)
{
System.out.println("I/O exception");
}
}
}