有没有一种方法可以避免在Java中将重复的行写入文件?

时间:2020-09-20 15:59:23

标签: java duplicates file-writing

我有一个简单的问题:

我有一些代码将数据行写入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()返回一对xy坐标作为字符串,而SimClock.getTime()返回时间戳。

我的解决方案是定义一个名为lastMsg的字符串,在该类的构造函数中将其初始化为null,然后检查receiveMessage()中message参数的ID是否具有在写入文件之前已更改:

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

1 个答案:

答案 0 :(得分:1)

似乎微不足道;该方法应检查“写的上一行”。如果相同,return;,则不执行任何操作。如果不是,则将其写入,然后更改“上一行已写入”字段。

如果要从多个线程中调用此方法,则可能会遇到麻烦(如果两个线程都调用向文件中写入“ Hello!”的方法,则可能会出现以下一行: {1}}-您需要进行一些同步,然后才能确保该字段也已同步。

HeHellllo!o!