Как правильно записать значение в файл несколько раз

Рейтинг: 1Ответов: 2Опубликовано: 04.04.2023

Подскажите, как правильно можно реализовать программу. Мне необходимо записать значение в файл несколько раз. На данном этапе я могу записать один раз и после этого, если я желаю добавить ещё один товар у меня перезаписывается строка. Можно ли сделать через рекурсию и всё в одном классе ?

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();
}

}

Ответы

▲ 3Принят

Чтобы писать в конец файла, не перезаписывая содержимое файла, передайте вторым аргументом флаг append в конструктор FileWriter:

new FileWriter("G:/Catalog2.txt", true)
▲ 1

Рекурсия здесь представляется излишней, так как приведёт к повторному переоткрытию/закрытию файла и новой обёртки для потока ввода.
Эффективнее и корректнее было бы передать в качестве аргумента название файла, в который будут сохраняться данные, и использовать обычный цикл.
Также для корректного закрытия ресурсов следует применить 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))) {
        // ...
    }
}