如何删除文件中的重复行

时间:2012-03-20 19:18:46

标签: java swing file-io io filewriter

嗨我正在使用下面的方法从Jtextarea写入一个文件,我在Timer中每30秒调用一次这个方法,但是只在文件中添加新行,它会重写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 个答案:

答案 0 :(得分:1)

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

上面的代码在构造函数中使用了附加的boolean标志,将其设为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();
            }
        }
    }
  }

答案 1 :(得分:1)

变化:

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

为:

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

或只是:

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

The constructor you're using for FileWriter takes two argumentsString文件名和boolean,表示如果已存在,是否附加到文件。当你将此设置为true时,它会将文本区域的上下文附加到文件上,而不是将文件替换为仅包含当前文本的文件。

如果您想保留文件的现有内容:

  • 继续使用append选项,仅在关闭应用程序时更新文件。
  • 在应用程序启动时读取文件的内容,并在添加文本区域的当前内容之前将其写入新文件。

答案 2 :(得分:1)

您肯定需要附加到该文件(因此请在构造函数中保留true)。

你做错的是使用Swing组件来存储数据。 Swing组件旨在显示数据。想象一下如果您的经理/主管/老师告诉您使用另一个GUI库或将整个应用程序转换为Web服务器会发生什么 - 您将不得不放弃JTextArea,然后无处可以保存日志消息。

您应该收集一些日志消息,例如List,然后使用此集合显示消息。您的日志消息类可以具有将日志消息转换为String的功能。然后,每30秒查看一次列表只是一个问题,并附加时间戳比上次保存时间更新的消息。

答案 3 :(得分:0)

我更改了代码而不是从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以显示在GUI中并调用方法loger()来写入文件,例如:

textArea.append(dateTime()+“:操作员从菜单栏中静音的警报声音”);

loger(dateTime()+“:操作员从菜单栏中静音警报声”);

通过这种方式,我在Jtextarea和文件中有日志。当我重新启动应用程序时,我的问题得到解决,文件没有被删除,新的日志被添加到文件中。 谢谢大家。