Изначально пробовал статическими методами Files все делать - не катит. Ну да ладно, там в требованиях явное создание потока ввода\вывода есть, окей.
Сейчас тоже упускаю что-то, но уже не особо догоняю что именно. Ругается, грубо говоря, на все.
package com.javarush.task.task31.task3101;
import java.io.*;
import java.util.*;
/*
Проход по дереву файлов
*/
public class Solution {
public static void main(String[] args) throws Exception {
File newResultingFile = renameFileAndReassignReference(new File(args[0]),new File(args[1]));
Map<File,byte[]> sortedMap = new TreeMap<>(new FileLengthComparator());
walkFileTreeAndReadContent(new File(args[0]),sortedMap);
sortedMap.remove(newResultingFile);
writeFilesContentToResultingFile(newResultingFile,sortedMap);
}
private static void writeFilesContentToResultingFile(File destinationFile,Map<File,byte[]> filesContent) throws IOException {
try (FileOutputStream fileOutputStream = new FileOutputStream(destinationFile)) {
for (Map.Entry<File,byte[]> entry:
filesContent.entrySet()) {
fileOutputStream.write(entry.getValue());
fileOutputStream.write(System.lineSeparator().getBytes());
}
} catch (FileNotFoundException fnfe){
throw new FileNotFoundException("No such file found");
} catch (IOException ioe){
throw new IOException();
}
}
private static void walkFileTreeAndReadContent(File startingPath, Map<File,byte[]> filesWithContent)
throws IOException{
File[] filesTree = startingPath.listFiles();
if(filesTree == null){
return;
}
for (File path:
filesTree) {
if(path.isDirectory()){
walkFileTreeAndReadContent(path.getAbsoluteFile(),filesWithContent);
} else {
if(path.length()<50){
filesWithContent.put(path,readFileContent(path));
}
}
}
}
private static byte[] readFileContent(File file) throws IOException {
byte[] fileContent;
try(FileInputStream fileInputStream = new FileInputStream(file)){
int bytesAvailable = fileInputStream.available();
fileContent = new byte[bytesAvailable];
int bytesRead = fileInputStream.read(fileContent);
if(bytesRead!=bytesAvailable){
throw new IOException();
} else {
return fileContent;
}
} catch (FileNotFoundException fnfe){
throw new FileNotFoundException("No such file found");
} catch (IOException ioe){
throw new IOException("IOE");
}
}
private static File renameFileAndReassignReference(File originalDirectory, File originalFile)
throws FileNotFoundException {
if(originalDirectory!=null && originalDirectory.isDirectory()){
if(originalFile!=null && FileUtils.isExist(originalFile)){
File newOutputFile = new File(originalFile.getParent() + "/allFilesContent.txt");
FileUtils.renameFile(originalFile, newOutputFile);
return newOutputFile;
} else {
return new File(originalDirectory + "/allFilesContent.txt");
}
}else {
throw new FileNotFoundException("No such file found");
}
}
private static class FileLengthComparator implements Comparator<File>{
@Override
public int compare(File o1, File o2) {
return o1.getName().compareTo(o2.getName());
}
}
}
Остались формальности, как обычно. Не там поток открыл, и тому подобное.
Upd.
Приняло.
Переименовал файл в main() без каких-либо проверок на существование.
Плюс перегрузил метод для записи результата так, чтобы он принимал поток, который я создал в main() и прошло.
То ли валидатор проверяет наличие объекта-потока в области видимости main() то ли еще что. Не первый раз ругается на потоки, если их область видимости какими-то методами вне main() ограниченна.