0

在下面的示例中,我能够识别整体变化。但我无法获得单独编辑或添加的字符串。是否有任何算法/方法来检测字符串是否在文件中被编辑、添加或删除?我尝试过 java File Watcher,但它只检测一个文件,无论该文件是否已被编辑或创建或删除或修改文件中的任何内容。它不提供已在文件中执行的更改。

diffFiles函数只是检查一个字符串是否在两个文件中都匹配。我已经制作了基本文件的副本并检查了差异:

public HashMap<String, Integer> diffFiles(List<String> firstFileContent, List<String> secondFileContent) throws IOException {  
      Integer count = 0;
      final HashMap<String, Integer> diff = new HashMap<String, Integer>();
      for (final String line : firstFileContent) {
          count += 1;
          if (!secondFileContent.contains(line)) {
              diff.put(line, count);
          }
      }
      return diff;
  }

我想单独识别文件中的字符串是否已在文件中编辑或添加

4

3 回答 3

0

你可以使用一个叫做 Checksum 的类,它用于检查是否收到了完整的消息,Checksum 进行干预以确保不会丢失任何位

于 2020-06-24T09:26:00.150 回答
0

这里有一些方法可以做到这一点:

校验和

它是您数据的简短表示。

代码:

var content = "this is my file content"
var b = content.getBytes()

要计算每个文件,您需要:

public static long getChecksum(byte[] bytes) {
    Checksum crc32 = new CRC32();
    crc32.update(bytes, 0, bytes.length);
    return crc32.getValue();
}

如果两者long相同。它们是完全相同的内容。

Apache Commons 编解码器

您还可以使用 sha256 与 Apache Commons Codecs 一起执行此操作:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.11</version>
</dependency>

验证是:

String sha = DigestUtils.sha256Hex(yourFullFileContentString);

如果两个字符串(例如:)sha相同。你有一个相同的内容。

番石榴图书馆

谷歌图书馆也有同样的可能

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>20.0</version>
</dependency>

这里的代码:

var sha = Hashing.sha256()
  .hashString(yourFullFileContentString, StandardCharsets.UTF_8).toString();

选择哪一个

我会选择校验和,因为它不是安全哈希算法 (SHA)。

于 2020-06-24T09:39:08.457 回答
0

通过实施diffFiles(),您将获得第一个文件中的所有行,但第二个文件中缺少。

它不会为您提供第二个文件中的所有行,但不会提供第一个文件中的所有行。它会将在第二个文件中移动位置的行报告为“未更改”。

正如您已经注意到的那样,您无法确定是否添加/插入了一行,或者是否刚刚修改了现有行(例如,修复了一个错字)。


您要求的基本上是“diff”工具的 Java 实现,而 StackOverflow 已经为此提供了很多答案:

可能还有更多,其中一些答案只是建议使用一些库,而另一些答案并没有完全找到您想要的解决方案,但所有这些答案都应该让您了解如何继续。

而且这里的链接确实也出现在右侧栏是因为这些链接在这里......</p>

于 2020-06-24T14:56:23.823 回答