Данные автоматически теряются после перезаписи при перезапуске программы

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

> public class writeFile {

    private Writer fw;
    public writeFile(String fileName) {
        try {
            fw = new FileWriter(fileName, false);
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }

    public void writeToCSV(String[] org) {
        String text = "";
        for(int i = 0; i < org.length; i++) {
            text += org[i];
            if (i != org.length - 1) {
                text += ",";
            } else {
                text += "\n";
            }
        }
        try {
            fw.write(text);
            fw.flush();
            //fw.close();
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }

    public void shutDown() {
        try {
            fw.close();
        } catch(IOException e) {
            System.out.println(e.toString());
        }
    }
}

Выше мой класс writeFile. Может ли кто-нибудь помочь мне объяснить и исправить это?

shutDown почти наверняка не вызывается надежно. Кстати, что вы собираетесь делать, если один из элементов вашего массива содержит одну или несколько запятых? Вам следует использовать подходящий модуль записи CSV. кстати, названия классов должны быть на основе существительных
g00se 11.08.2024 12:46

Где вы вызываете метод writeToCSV()?

DevilsHnd - 退した 11.08.2024 12:47

Привет всемогущий, добро пожаловать, вам нужно только изменить fw = new FileWriter(fileName, false); to fw = new FileWriter( fileName, true ); и каждая запись будет агрегировать данные, а не перезаписывать их.

Marce Puente 11.08.2024 13:24

Я предполагаю, что вы имеете в виду «мой файл пуст». Поскольку вы открываете Writer без добавления, я предполагаю, что вы знаете, что все предыдущее будет перезаписано.

g00se 11.08.2024 14:02

Если вы решили заняться домашним пивоварением, то, возможно: 1. Сделайте название класса существительным, например. CsvWriter 2: реализовать AutoCloseable 3: не объединять String, писать поля прямо 4: сбросить после разделителя строк 5: использовать Files.newBufferedWriter, чтобы получить Writer

g00se 11.08.2024 16:28

@rzwitserloot, вы можете зайти на веб-сайт Oracle и прочитать FileWriter public FileWriter(String fileName, boolean Append) выдает IOException Создает объект FileWriter по имени файла с логическим значением, указывающим, следует ли добавлять записанные данные . ;)

Marce Puente 12.08.2024 04:19

Я запутал своих конструкторов. Комментарий отозван, @MarcePuente

rzwitserloot 12.08.2024 12:10

@rzwitserloot, Только великие люди признают свои ошибки, я рад, что ты являешься частью сайта.

Marce Puente 12.08.2024 13:47

всем спасибо, я решил свои проблемы.

allmight 13.08.2024 14:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте параметр append

Проблема возникает из-за второго аргумента конструктора FileWriter.

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

Параметры:

  • fileName: String, представляющий системно-зависимое имя файла.
  • append: boolean, который, если установлен в true, будет записывать данные в конец файла, а не в начало.

См. Javadoc для конструкторов:

это полезно, я понял свою ошибку и решил ее. Большое спасибо!

allmight 13.08.2024 14:18

Ответ Резаи правильный. Кроме того, я автоматически закрывал файл при каждом использовании. Нет смысла держать файл открытым.

Автоматическое закрытие при каждом использовании

Класс FileWriter реализует AutoCloseable. Это означает, что мы можем использовать синтаксис try-with-resources для автоматического закрытия.

В соответствии с соглашением Java начинайте имя класса с заглавной буквы. И выберите более конкретное описательное имя, например CsvWriter.

Как правило, лучше всего делать ваши конструкторы максимально короткими, простыми и понятными. Если вам нужно перехватывать исключения, рассмотрите другой дизайн.

Лучше явно указать предполагаемую кодировку символов, чем неявно полагаться на значение по умолчанию. Позже сообщите о своих намерениях программистам, читающим ваш код. Так что используйте этот конструктор.

public class CsvWriter {

    // Fields
    private String fileName ;

    // Constructor
    public CsvWriter( final String aFileName ) {
        this.fileName = aFileName ;
    }

    // Behavior
    public void write ( final String[] input ) {
        try
        (
            FileWriter writer = new FileWriter( this.fileName , StandardCharsets.UTF_8 , true ) ;  // `true` to append to file rather than replace. 
        )
        {
            // write your CSV, call methods on `writer` variable. 
        }
        catch ( … ) { … }
        // The file writer is automatically closed at this point. 
    }
}

Использование:

CsvWriter csvWriter = new CsvWriter( … ) ;
csvWriter.write( … ) ;
…
csvWriter.write( … ) ;

В этом коде предполагается, что вы работаете в однопоточном режиме. Этот код не является потокобезопасным.

Конечно, в реальной работе вы бы использовали одну из хороших библиотек CSV, а не создавали бы свои собственные.

Другие вопросы по теме