Erik_Mironov
@Erik_Mironov
Старые вопросы: *Dies from cringe*

Почему out.write записывает null?

На вход метода main() подаются два параметра.
Первый - filePath - путь к директории, второй - resultFileAbsolutePath - имя (полный путь) существующего файла, который будет содержать результат. Переименовать resultFileAbsolutePath в allFilesContent.txt . Для каждого файла в директории filePath и в ее всех вложенных поддиректориях выполнить следующее:
Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:
- Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.
- В allFilesContent.txt последовательно записать содержимое всех файлов отсортированных файлов. После каждого тела файла записать "\n".
Все файлы имеют расширение txt.


Никак не могу понять, почему в allFilesContent.txt записывается null, все текстовые файлы с тестовой директории < 50 байт.
File filePath = new File(args[0]);
       
        File resultAbsolutePath = new File(args[1]);
        File destination = new File(resultAbsolutePath.getParent() + "/allFilesContent.txt");
        FileUtils.renameFile(resultAbsolutePath, destination);
      
        ArrayList<File> fileList = getFileList(filePath);

        FileOutputStream out = new FileOutputStream(destination);
        
        Collections.sort(fileList);

        for(int i = 0; i < fileList.size(); i++){
            
            FileInputStream stream = new FileInputStream(fileList.get(i));
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            String str;
            
            while((str = reader.readLine()) != null){
                str += str;
            }
            stream.close();
            reader.close();
           
            out.write((str + "\n").getBytes());
            out.flush();
        }
        out.close();

    }

    public static ArrayList<File> getFileList(File path) {
        ArrayList<File> list = new ArrayList<>();
        for (File file : path.listFiles()) {
            if (file.isDirectory()) {
                ArrayList<File> proxyFileList = getFileList(file);
                list.addAll(proxyFileList);
            } else if (file.length() <= 50) {
                list.add(file);
            }
        }
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
@Shiftuia
Java-программист
В вашем случае str постоянно перезаписывается и в последнем цикле в str записывается null
String str;
            
            while((str = reader.readLine()) != null){
                str += str;
            }


Данный код можно переписать на
String resultStr;
String line;
            
            while((line = reader.readLine()) != null){
                resultStr += line;
            }

или в случае использования версии java от 8 и выше весь механизм чтения из файла можно заменить на
String resultStr = String.join("\n", Files.readAllLines(file.toPath()));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы