Замена строк, удаление и смещение строк в текстовом файле

Дано: текстовый файл с содержимым в виде:

строка1
строка2
строка3
строка4
...

Задача1: заменить определенную строку файла на другой текст (в данном случае на текст из заданного параметра программы).

Задача2: удалить определенную строку (например вторую) и поднять остальные строки так, чтобы не было пустой строки, т.е. результат должен быть:

строка1
строка3
строка4
...

Мой путь решения:

  • считал строки в лист;

  • далее в зависимости от задачи заменял одну строку листа на текст из параметров программы или удалял строку из него;

  • на следующем этапе записываю строки листа в стрингу, а стрингу в файл:

      Path path = Paths.get(file);
      String allLines = "";
      for (String s: lines) {
          allLines += s + "\n";
      }
      Files.writeString(path, allLines);
    

Проблема: И здесь я натыкаюсь на неожиданное для меня явление: вся стринга записывается в файл в одну строку, а не построчно, как планировалось.

Вопросы: Почему запись в файл происходит в одну строку? Как добиться нужного результата и есть ли другие способы замены части текста файла на другой и удаление определенной строки с последующим смещением остальных строк? Спасибо!

P.S. решил эту задачу через BufferedWriter'ы:

switch (args[0]) {
   case "-u":
      try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
          for (int i = 0; i < lines.size(); i++) {
         if (lines.get(i).substring(0, 8).trim().equals(args[1]) ||
             lines.get(i).substring(0, lines.get(i).indexOf(" ")).equals(args[1])) {

                 lines.set(i, newLine);
                 writer.write("");
             }
          }
       }
   break;

case "-d":
   try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
      for (int i = 0; i < lines.size(); i++) {

         if (lines.get(i).substring(0, 8).trim().equals(args[1]) ||
             lines.get(i).substring(0, lines.get(i).indexOf(" ")).equals(args[1])) {

                 lines.remove(i);
                 writer.write("");
             }
          }
       }
    break;
  }

try (BufferedWriter writer2 = new BufferedWriter(new FileWriter(file, true))) {
   for (String line : lines) { 
       writer2.write(line);
       writer2.newLine();
   }
}

Но это решение не самое красивое, т.к. приходится создавать отдельный райтер для очистки содержимого файла и отдельный - для записи непосредственно из листа, и что совсем не радует - использовать копирование кода.


Ответы (0 шт):