1

嗨,我正在使用以下方法从 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

4 回答 4

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();
            }
        }
    }
  }
于 2012-03-20T19:23:19.343 回答
1

改变:

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

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

  • 继续使用附加选项,仅在关闭应用程序时更新文件。
  • 在应用程序启动时读取文件的内容并将其写入新文件,然后再添加文本区域的当前内容。
于 2012-03-20T19:23:41.427 回答
1

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

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

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

于 2012-03-20T21:36:03.403 回答
0

我更改了我的代码,而是从 Jtextarea 写入文件,我将字符串 (LOG) 直接写入文件。我的方法 logger() 变成如下: public void logger (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 中显示并调用方法 logger() 写入文件,例如:

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

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

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

于 2012-03-21T22:34:43.690 回答