Вечно он ругается что потоки не закрыты если юзаешь try-with-resources.
Правильно ли я понимаю что если в трае кинет исключение, ресурсы все равно будут закрыты, несмотря на отсутствие finally и валидатор тут цепляется не по делу?
Ну а так - все как обычно
"Создай поток для записи в файл без суффикса [.partN] в папке, где находятся все считанные файлы."
Вот же:
Убрали суффикс
String resulFileName = fileParts.firstKey().toPath().toString();
resulFileName = resulFileName.substring(0,resulFileName.lastIndexOf(".part"));
Создали поток.
try (OutputStream fileOutputStream = new FileOutputStream(resulFileName))
"В новый файл перепиши все байты из файлов-частей *.partN.
Чтение и запись должны происходить с использованием буфера."
for (Map.Entry entry:
fileParts.entrySet()) {
byte[] filePartData = (byte[])entry.getValue();
fileOutputStream.write(filePartData);
}
Данные в файл пишет - по поводу буффера, ну массивами пишу же - считай буффер тоже есть.
"Созданные для файлов потоки должны быть закрыты."
Ну, тут я считаю что try-with-resources это за меня сделает.
По поводу "end" вообще только сейчас увидел - но валидатор принял этот пункт)
Еще ругается на
"Файлы переписывать нужно не в порядке добавления, а от первой части к последней."
Ну так мапа же реализует интерфейс SortedMap, то бишь для элементов происходит сортировка по natural order, если не передан компаратор - проверял, все по порядку сортируетpackage com.javarush.task.task18.task1825;
import java.io.*;
import java.nio.file.Files;
import java.util.*;
/*
Собираем файл
*/
public class Solution {
public static void main(String[] args) throws Exception {
TreeMap<File,byte[]> fileParts = getFileParts(5);
appendFileParts(fileParts);
}
private static TreeMap<File,byte[]> getFileParts(int quantity) throws FileNotFoundException{
TreeMap<File,byte[]> fileParts = new TreeMap<>();
File filePart;
byte[] filePartData;
try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in))) {
for(int i=0; i<quantity; i++){
filePart = new File(consoleReader.readLine());
filePartData = Files.readAllBytes(filePart.toPath());
fileParts.put(filePart,filePartData);
}
} catch (FileNotFoundException fnfEx){
System.err.println("No such file found.");
} catch (IOException ioEx){
System.err.println("Failed to read from console.");
}
if(fileParts.size()!=0){
return fileParts;
} else throw new FileNotFoundException("File objects creation failed.");
}
private static void appendFileParts(TreeMap<File,byte[]> fileParts) throws IOException {
String resulFileName = fileParts.firstKey().toPath().toString();
resulFileName = resulFileName.substring(0,resulFileName.lastIndexOf(".part"));
try (OutputStream fileOutputStream = new FileOutputStream(resulFileName)) {
for (Map.Entry entry:
fileParts.entrySet()) {
byte[] filePartData = (byte[])entry.getValue();
fileOutputStream.write(filePartData);
}
} catch (IOException ioe){
throw new IOException("Failed to create result file",ioe);
}
}
}