Добрый день! Буду благодарен за помощь в решении задачи.
Ниже будет мое решение с максимально расписанными объяснениями.
К слову, при тестировании с помощью txt файлов, желанный результат я получил - записал несколько файлов в новый в нужном порядке.
package com.javarush.task.task18.task1825;
import java.io.*;
import java.util.*;
/*
Собираем файл
*/
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Map<Integer, ArrayList<Integer>> map = new HashMap<>(); //здесь будут храниться: key-номер части, value - массив байт из части
StringBuilder path = new StringBuilder(); //переменная для пути к катологу для создания нового файла
while (true) { // создаем цикл для считывания путей к частям
StringBuilder fileNum = new StringBuilder(); //создаем переменную для получения номера части
String fileName = reader.readLine(); // считываем название файла
if (!fileName.equals("end")) { // проверяем не ввели ли мы "end"
for (int i = fileName.length() - 1; i > 0; i--) { //цикл для получения номера части и записи ее в переменную fileNun
if (fileName.charAt(i) != 't') fileNum.append(fileName.charAt(i));
else i = 0;
}
fileNum.reverse();// делаем инверсию полученного номера(так как запись с конца идет)
//получаем путь к каталогу исходя из последнего введного пути к файлу PartN
path.delete(0,path.length());
int count = 0;
for (int i = fileName.length() - 1; i > 0; i--) {
if (fileName.charAt(i) == '/') {
count = i + 1;
i = 0;
}
}
for (int i = 0; i < count; i++) path.append(fileName.charAt(i));
//создаем поток для считывания байтов из файла и производим запись в ArrayList
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(fileName));
ArrayList<Integer> list = new ArrayList<>();
while (bufferedInputStream.available() > 0) list.add(bufferedInputStream.read());
//полученную переменную номера части и массив из байтов интегрируем в mар
map.put(Integer.parseInt(fileNum.toString()), list);
bufferedInputStream.close();//закрываем поток считывания
//следовательно цикл будет повторяться пока мы не введем слово "end"
} else break;
}
reader.close(); //закрваем поток ввода имена файла
new File(path.toString() + "Lion.avi"); //создаем файл из полученного нами пути к каталогу + название.расширение нашего файла
//создаем поток для записи в файл
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path.toString() + "Lion.avi"));
int partN = 1;//счетчик для оринетировки какой номер файла нам необходимо записать(при условии, что части начинаются с №1)
while (partN <= map.size()) { //цикл который дает нам возможность перебора Map пока все части не будут записаны(кол-во частей = размер Map)
//создаем перебор map
for (Map.Entry<Integer, ArrayList<Integer>> entry : map.entrySet()) {
if (partN == entry.getKey()) { //при нахождении ключа, который равен номеру части, которую мы должны записать производим запись в файл
for (int i = 0; i < entry.getValue().size(); i++) {
bufferedOutputStream.write(entry.getValue().get(i));
}
partN++; //так как эту часть мы записали, переходим к следующей
}
}
}
bufferedOutputStream.close(); // закрываем поток
}
}
// /Users/edgargilmanov/Desktop/text.part1