Замена строк, удаление и смещение строк в текстовом файле
Дано: текстовый файл с содержимым в виде:
строка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();
}
}
Но это решение не самое красивое, т.к. приходится создавать отдельный райтер для очистки содержимого файла и отдельный - для записи непосредственно из листа, и что совсем не радует - использовать копирование кода.