Как удалить повторяющуюся строку в файле - PullRequest
1 голос
/ 20 марта 2012

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

public void loger() {

    FileWriter writer = null;

    try {
        writer = new FileWriter("MBM_Log_"+date()+".txt" , true);
        textArea.write(writer);

        } catch (IOException exception) {
        System.err.println("log error");
        exception.printStackTrace();

        } finally {
        if (writer != null) {
            try {
                writer.close();
                } catch (IOException exception) {
                System.err.println("Error closing writer");
                exception.printStackTrace();
            }
        }

    }

  }

Ответы [ 4 ]

1 голос
/ 20 марта 2012

Изменить:

writer = new FileWriter("MBM_Log_"+Date()+".txt" , true);

на:

writer = new FileWriter("MBM_Log_"+Date()+".txt", false);

или просто:

writer = new FileWriter("MBM_Log_"+Date()+".txt");

Конструктор, который вы используете для FileWriterпринимает два аргумента : String имя файла и boolean, который говорит, добавлять ли файл, если он уже существует.Поскольку в настоящее время этот параметр установлен на true, он добавляет контексты текстовой области в файл, а не заменяет файл на текст с текущим текстом.

Если вы хотите сохранить существующее содержимоелибо файла:

  • Продолжайте использовать опцию добавления и обновляйте файл только при закрытии приложения.
  • Считайте содержимое файла при запуске приложения и запишите этов новый файл перед добавлением текущего содержимого текстовой области.
1 голос
/ 21 марта 2012

Вам определенно нужно добавить файл (поэтому оставьте true в конструкторе).

Что вы делаете неправильно, так это использование компонента Swing для хранения данных.Компоненты Swing предназначены для отображения данных.Представьте себе, что произойдет, если ваш менеджер / руководитель / учитель скажет вам использовать другую библиотеку графического интерфейса или преобразовать все приложение в веб-сервер - вам придется отказаться от JTextArea и тогда некуда будет сохранять сообщения журнала.

У вас должна быть некоторая коллекция сообщений журнала, например List, а затем отобразить сообщения, используя эту коллекцию.Ваш класс сообщений журнала может иметь некоторую функцию для преобразования сообщения журнала в String.Тогда было бы просто вопрос просматривать список каждые 30 секунд и добавлять сообщения, отметка времени которых новее, чем время последнего сохранения.

1 голос
/ 20 марта 2012
writer = new FileWriter("MBM_Log_"+Date()+".txt" , true);

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

writer = new FileWriter("MBM_Log_"+Date()+".txt" , false);

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

FileWriter writer = new FileWriter("MBM_Log_"+date()+".txt" , true);

public void loger() {

    try {       
        textArea.write(writer);
        } catch (IOException exception) {
        System.err.println("log error");
        exception.printStackTrace();
        } finally {
        if (writer != null) {
            try {
                writer.close();
                } catch (IOException exception) {
                System.err.println("Error closing writer");
                exception.printStackTrace();
            }
        }
    }
  }
0 голосов
/ 22 марта 2012

Вместо этого я изменил свой код для записи в файл из Jtextarea. Я записал строку (LOG) непосредственно в файл. Мой метод loger () становится как показано ниже: public void loger (String texLine) {

    FileWriter writer = null;

    try {       
        writer = new FileWriter("MBM_Log_"+date()+".txt" , true);
        PrintWriter out = new PrintWriter(writer);
        out.printf("%s"+"%n", texLine);
                    out.close();
        } catch (IOException exception) {
        System.err.println("log error");
        exception.printStackTrace();
        }

    finally {
        if (writer != null) {
            try {
                writer.close();
                } catch (IOException exception) {
                System.err.println("Error closing writer");
                exception.printStackTrace();
            }
        }
    }

    }

А затем я записываю журнал в Jtextarea для отображения в графическом интерфейсе и вызываю метод loger () для записи в файл, например:

textArea.append (dateTime () + ": звук тревоги отключен оператором из строки меню");

loger (dateTime () + ": звуковой сигнал отключен оператором из строки меню");

Таким образом, у меня есть журналы в Jtextarea и в файле. Моя проблема решается, когда я перезапускаю приложение, файл не стирается, и новый файл добавляется в файл. Спасибо всем.

...