【问题标题】:How to remove duplicate line in a file如何删除文件中的重复行
【发布时间】:2012-04-05 07:30:03
【问题描述】:

您好,我正在使用以下方法从 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();
            }
        }

    }

  }

【问题讨论】:

  • 我是否正确理解您每 30 秒创建一个新文件并且希望每个文件仅包含过去 30 秒的消息?
  • 不,我只是每 30 秒更新一次同一个文件。
  • writer = new FileWriter("MBM_Log_"+Date()+".txt" , true); 如果Date() 是一个方法,它应该被称为date()
  • 谢谢安德鲁,我改了,是的,这是一种方法。
  • 名称 "MBM_Log_"+date()+".txt" 允许我每天获取一个日志文件,例如 MBM_Log_20-03-2012

标签: java swing file-io io filewriter


【解决方案1】:
writer = new FileWriter("MBM_Log_"+Date()+".txt" , true);

上面的代码在构造函数中使用了附加布尔标志,使其为假并重试:

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

【讨论】:

  • 我想避免在重新启动应用程序时丢失文件的内容。使用 false 它创建一个新的擦除文件的内容。
  • 谢谢,但我现在收到此错误:未处理的异常类型 IOException
  • @Abs 所以在 try-catch 块中单独创建这个文件编写器。我猜你是java的新手。
【解决方案2】:

变化:

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,它会将文本区域的上下文附加到文件中,而不是将文件替换为仅包含当前文本的文件。

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

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

【讨论】:

  • 我已经对此进行了测试,但是当我重新启动我的应用程序时,该文件被一个新的文件删除,然后我丢失了我的日志。还有其他方法吗?
  • @Dave-1。我们需要从文件中读取日志,并且应用程序应该运行很长时间,它会监控来自 router.2 的流量。这个怎么办?谢谢
【解决方案3】:

你肯定需要追加到文件中(所以在构造函数中留下true)。

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

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

【讨论】:

  • 我将日志直接写入文件以保留历史记录 + 附加到 Jtextarea 以供显示。我昨天测试它工作正常。无论如何感谢您的回答。
【解决方案4】:

我更改了代码,改为从 Jtextarea 写入文件,我将字符串 (LOG) 直接写入文件。我的方法 logger() 变为如下: 公共无效记录器(字符串 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 中显示并调用方法 logger() 写入文件例如:

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

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

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

【讨论】:

  • 您可以将此答案标记为已接受,这样问题就不会再出现在未回答的问题中。如果你觉得我至少给了你这个想法,你可以投票赞成我的声誉。
  • 我是这个网站的新手,所以不能投票,我必须等待 16 小时才能接受回答。
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2011-11-08
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多