Java 如何删除文件中的重复行
嗨,我正在使用下面的方法从Jtextarea写入一个文件,我在一个计时器内每隔30秒调用一次这个方法,但是为了只在文件中添加新行,它重写了Jtextarea中包含的所有行,所以我有重复的行。我想避免这种情况,只使用新行更新文件。你能帮帮我吗Java 如何删除文件中的重复行,java,swing,file-io,io,filewriter,Java,Swing,File Io,Io,Filewriter,嗨,我正在使用下面的方法从Jtextarea写入一个文件,我在一个计时器内每隔30秒调用一次这个方法,但是为了只在文件中添加新行,它重写了Jtextarea中包含的所有行,所以我有重复的行。我想避免这种情况,只使用新行更新文件。你能帮帮我吗 public void loger() { FileWriter writer = null; try { writer = new FileWriter("MBM_Log_"+date()+".txt" , true);
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();
}
}
}
}
上面的代码在构造函数中使用追加布尔标志,将其设为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();
}
}
}
}
更改:
writer = new FileWriter("MBM_Log_"+Date()+".txt" , true);
致:
或者只是:
writer = new FileWriter("MBM_Log_"+Date()+".txt");
:一个字符串
文件名和布尔值
,表示如果文件已经存在,是否追加到文件中。当您当前将此设置为true
时,它会将文本区域的上下文追加到文件中,而不是仅用当前文本替换文件
如果要保留文件的现有内容,请执行以下操作之一:
- 继续使用append选项,仅在关闭应用程序时更新文件
- 在应用程序启动时读取文件内容,并在添加文本区域的当前内容之前将其写入新文件
true
)
您所做的有点错误的是使用Swing组件来存储数据。Swing组件用于显示数据。想象一下,如果您的经理/主管/老师告诉您使用另一个GUI库或将整个应用程序转换为web服务器,您将不得不放弃JTextArea,然后将无处保存日志消息,会发生什么情况
您应该有一些日志消息的集合,例如
列表
,然后使用此集合显示消息。日志消息类可以使用一些函数将日志消息转换为字符串
。然后每30秒检查一次列表并附加时间戳比上次保存时间新的消息就成了一个问题。我更改了代码,改为从Jtextarea写入文件,我将字符串(日志)直接写入文件。我的方法loger()如下所示:
公共无效记录器(字符串texLine){
然后我将日志写入要在GUI中显示的Jtextarea,并调用方法loger()写入文件,例如:
textArea.append(dateTime()+“:操作员从菜单栏静音的报警声”)
loger(dateTime()+“:操作员从菜单栏静音的报警声”)
通过这种方式,我将日志保存在Jtextarea和文件中。当我重新启动应用程序时,我的问题得到了解决,文件没有被删除,新的日志被添加到文件中。
感谢大家。我是否正确理解您每30秒创建一个新文件,并且希望每个文件只包含过去30秒的消息?不,我只是每30秒更新一次相同的文件。
writer=new FileWriter(“MBM_Log”+Date()+“.txt”,true);
IfDate()
是一种方法,它应该被称为date()
。感谢Andrew,我更改了它。是的,它是一种方法。名称为“MBM\u Log”+date()+”允许我每天获取一个日志文件,例如MBM_log_20-03-2012我已经测试过了,但是当我重新启动应用程序时,该文件被一个新的文件删除,然后我就丢失了日志。还有另一种方法吗?@Dave-1。我们需要从文件中读取日志,应用程序应该运行很长时间,它会监控来自路由器的流量。2.如何做到这一点hanksI希望在重新启动应用程序时避免丢失文件内容。如果为false,则会创建一个新文件来擦除文件内容。谢谢,但我现在收到了以下错误:未处理的异常类型IOException@Abs所以在try-catch块中单独创建这个filewriter。我想你是java新手。你可以将这个答案标记为acc接受,这样这个问题就不会再出现在未回答的问题中。如果你觉得我至少给了你这个想法,你可以为我的答案的声誉投票。我是这个网站的新手,所以不能投票,我必须等待16小时才能接受答案。我直接将日志写入文件以保留历史记录+附加到Jtextarea以供显示。我测试了是的第三天工作很好。无论如何,谢谢你的回答。
writer = new FileWriter("MBM_Log_"+Date()+".txt", false);
writer = new FileWriter("MBM_Log_"+Date()+".txt");
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();
}
}
}
}