Как правильно записать значение в файл несколько раз
Подскажите, как правильно можно реализовать программу. Мне необходимо записать значение в файл несколько раз. На данном этапе я могу записать один раз и после этого, если я желаю добавить ещё один товар у меня перезаписывается строка. Можно ли сделать через рекурсию и всё в одном классе ?
public class Basket {
public void backTovar(String katal) throws IOException {
File file = new File("G:/Catalog2.txt");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new FileWriter("G:/Catalog2.txt"));
String mes = switch (katal) {
case "1" -> "Товар Штаны (чёрного цвета) добавлен в корзину";
case "2" -> "Товар Штаны (желтого цвета) добавлен в корзину";
case "3" -> "Товар Майка (белого цвета) добавлен в корзину";
case "4" -> "Товар Майка (чёрного цвета) добавлен в корзину";
case "5" -> "Товар Галстук (розового цвета) добавлен в корзину";
case "6" -> "Товар Галстук (чёрного цвета) добавлен в корзину";
case "7" -> "Товар Часы (белого цвета) добавлен в корзину";
case "8" -> "Товар Часы (серого цвета) добавлен в корзину";
default -> "Неизвестный товар : " + katal;
};
System.out.println(mes);
writer.write(mes);
System.out.println(" would you like add goods? (yes/no) ");
/* String result = bufferedReader.readLine();
if(result.equals("yes")){
System.out.println("Input number goods " );
String katal = bufferedReader.readLine();
return backTovar(String katal);
}*/
writer.close();
}
}
Ответы (2 шт):
Чтобы писать в конец файла, не перезаписывая содержимое файла, передайте вторым аргументом флаг append в конструктор FileWriter:
new FileWriter("G:/Catalog2.txt", true)
Рекурсия здесь представляется излишней, так как приведёт к повторному переоткрытию/закрытию файла и новой обёртки для потока ввода.
Эффективнее и корректнее было бы передать в качестве аргумента название файла, в который будут сохраняться данные, и использовать обычный цикл.
Также для корректного закрытия ресурсов следует применить try-with-resources, а для работы с консолью достаточно использовать сканер, а не буферизированный поток:
public void backTovar(String fileName) throws IOException {
File file = new File(fileName);
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
Scanner scanner = new Scanner(System.in);
String answer = "yes";
while ("yes".equalsIgnoreCase(answer)) {
System.out.println("Input goods ID: ");
String katal = scanner.nextLine();
String message = switch (katal) {
case "1" -> "Товар Штаны (чёрного цвета) добавлен в корзину";
case "2" -> "Товар Штаны (желтого цвета) добавлен в корзину";
case "3" -> "Товар Майка (белого цвета) добавлен в корзину";
case "4" -> "Товар Майка (чёрного цвета) добавлен в корзину";
case "5" -> "Товар Галстук (розового цвета) добавлен в корзину";
case "6" -> "Товар Галстук (чёрного цвета) добавлен в корзину";
case "7" -> "Товар Часы (белого цвета) добавлен в корзину";
case "8" -> "Товар Часы (серого цвета) добавлен в корзину";
default -> "Неизвестный товар : " + katal;
};
System.out.println(message);
writer.write(message);
writer.newLine(); // добавить новую строку!
System.out.println("Would you like to add more goods? (yes/no)");
answer = scanner.nextLine();
}
}
}
При необходимости добавлять строки в файл при записи, можно установить режим append в конструкторе FileWriter, как указано в ответе выше или даже параметризовать сам метод:
public void backTovar(String fileName, boolean append) throws IOException {
File file = new File(fileName);
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file, append))) {
// ...
}
}