Входные данные:
C:\\_Tests\\myText.txt.part1
C:\\_Tests\\myText.txt.part2
C:\\_Tests\\myText.txt.part3
endpackage com.javarush.task.task18.task1825;
import java.io.*;
import java.util.*;
/*
Собираем файл
*/
public class Solution {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// считываем первую строку
String filePath = reader.readLine();
// получаем директорию файлов
String[] splitDir = filePath.split("\\\\");
String dir = "";
for (int i = 0; i < splitDir.length - 1 ; i++) { // -1 т.к. мы не захватываем часть с файлом
dir += splitDir[i] + "\\";
}
// получаем имя файла без постфикса [.partN]
String[] splitFileName = splitDir[splitDir.length -1].split("\\."); // получаем часть с именем файла
String fileName = "";
for (int i = 0; i < splitFileName.length - 1; i++) { // -1 т.к. мы не захватываем постфикс
fileName += splitFileName[i] + (i + 1 == splitFileName.length - 1?"" : "."); // проверка, требуется ли ставить точку-разделитель
}
// считываем файлы
// HashMap для хранения <НомерФайла, ПутьКФайлу>
HashMap<Integer, String> files = new HashMap<Integer, String>();
while ( !"end".equals(filePath) ){
// получаем номер файла
String[] split = filePath.split("\\.");
Integer fileNumber = Integer.parseInt(split[split.length -1]
.replaceAll("[\\D]", "")); // убираем все нецифровые знаки
files.put(fileNumber, filePath);
filePath = reader.readLine();
}
// сортируем номера файлов
ArrayList<Integer> orderedFileNumbers = new ArrayList<Integer>(files.keySet());
Collections.sort(orderedFileNumbers); // сортируем от меньшего к большему
// buffer == общий объем файлов
byte[] buffer = new byte[getBufferSize(files)];
int startOffset = 0;
// переносим данные файлов в буффер
for (Integer i : orderedFileNumbers){
FileInputStream fis = new FileInputStream(files.get(i));
startOffset += fis.read(buffer,startOffset,fis.available()); // !!! startOffset или startOffset +1 ???
fis.close();
}
// создаем файл
File assembledFile = new File(dir + fileName);
FileOutputStream fos = new FileOutputStream(assembledFile);
fos.write(buffer);
fos.close();
}catch (Exception e){
System.out.println(e);
}
}
// получаем совокупный объем байт файлов
private static int getBufferSize(HashMap<Integer,String> files) throws ArithmeticException{
long totalSize = 0;
for (HashMap.Entry<Integer, String> entry : files.entrySet()){
totalSize += new File(entry.getValue()).length();
}
return Math.toIntExact(totalSize); // !при слишком больших файлах случится исключение ArithmeticException
}
}