有没有办法避免将重复行写入 Java 中的文件?
Is there a way to avoid writing duplicate lines to a file in Java?
我有一个简单的问题:
我有一些代码可以将数据行写入 Java 中的文本文件。将数据写入文件的方法调用之一位于调用频率高于数据本身更改的方法中。
因此,文本文件包含大量重复使用此方法编写的每一行。我知道事后我可以从文件中删除这些重复项,但我想知道是否有人知道首先避免将重复行写入文件的方法。感谢阅读。
向文件写入数据的方法:
@Override
public void writeMessage(String location, double time, String action) {
write(location + " " + time + " " + action);
}
以及调用它的方法:
public int receiveMessage(Message m, DTNHost from) {
int retVal = this.router.receiveMessage(m, from);
if (retVal == MessageRouter.RCV_OK) {
m.addNodeOnPath(this); // add this node on the messages path
}
writeMessage(untranslate().toString(), SimClock.getTime(), "receiving message");
return retVal;
}
untranslate.toString()
returns 一对 xy 坐标作为字符串,SimClock.getTime()
returns 一个时间戳。
我的解决方案是定义一个名为 lastMsg
的字符串,在 class 的构造函数中将其初始化为 null
,然后检查消息参数的 ID 是否在receiveMessage()
在写入文件之前已更改:
public int receiveMessage(Message m, DTNHost from) {
String currentMsg = m.getId();
int retVal = this.router.receiveMessage(m, from);
if (retVal == MessageRouter.RCV_OK) {
m.addNodeOnPath(this); // add this node on the messages path
}
if (!(currentMsg.equals(this.lastMsg))) {
writeMessage(untranslate().toString(), SimClock.getTime(), "receiving message");
this.lastMsg = currentMsg;
}
return retVal;
}
看似微不足道;该方法应检查 'previous line written'。如果相同,return;
,什么都不做。没有就写,改'previous line written'字段
如果你从多个线程调用这个方法,你已经有麻烦了(如果两个线程都调用一个将 'Hello!' 写入文件的方法,你最终可能会得到一个带有行:HeHellllo!o!
- 你需要一些同步。然后保证该字段也同步。所以:
private String lastLineWritten = null;
public /* synchronized - you may need this */ void writeLog(String line) {
if (line == null) throw new NullPointerException();
if (line.equals(lastLineWritten)) return;
lastLineWritten = line;
try (BufferedWriter bw = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
bw.write(line);
}
}
我有一个简单的问题:
我有一些代码可以将数据行写入 Java 中的文本文件。将数据写入文件的方法调用之一位于调用频率高于数据本身更改的方法中。
因此,文本文件包含大量重复使用此方法编写的每一行。我知道事后我可以从文件中删除这些重复项,但我想知道是否有人知道首先避免将重复行写入文件的方法。感谢阅读。
向文件写入数据的方法:
@Override
public void writeMessage(String location, double time, String action) {
write(location + " " + time + " " + action);
}
以及调用它的方法:
public int receiveMessage(Message m, DTNHost from) {
int retVal = this.router.receiveMessage(m, from);
if (retVal == MessageRouter.RCV_OK) {
m.addNodeOnPath(this); // add this node on the messages path
}
writeMessage(untranslate().toString(), SimClock.getTime(), "receiving message");
return retVal;
}
untranslate.toString()
returns 一对 xy 坐标作为字符串,SimClock.getTime()
returns 一个时间戳。
我的解决方案是定义一个名为 lastMsg
的字符串,在 class 的构造函数中将其初始化为 null
,然后检查消息参数的 ID 是否在receiveMessage()
在写入文件之前已更改:
public int receiveMessage(Message m, DTNHost from) {
String currentMsg = m.getId();
int retVal = this.router.receiveMessage(m, from);
if (retVal == MessageRouter.RCV_OK) {
m.addNodeOnPath(this); // add this node on the messages path
}
if (!(currentMsg.equals(this.lastMsg))) {
writeMessage(untranslate().toString(), SimClock.getTime(), "receiving message");
this.lastMsg = currentMsg;
}
return retVal;
}
看似微不足道;该方法应检查 'previous line written'。如果相同,return;
,什么都不做。没有就写,改'previous line written'字段
如果你从多个线程调用这个方法,你已经有麻烦了(如果两个线程都调用一个将 'Hello!' 写入文件的方法,你最终可能会得到一个带有行:HeHellllo!o!
- 你需要一些同步。然后保证该字段也同步。所以:
private String lastLineWritten = null;
public /* synchronized - you may need this */ void writeLog(String line) {
if (line == null) throw new NullPointerException();
if (line.equals(lastLineWritten)) return;
lastLineWritten = line;
try (BufferedWriter bw = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
bw.write(line);
}
}