gpt4 book ai didi

java - 仅通过文件之间的差异更新数据(java 的增量)

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:27 25 4
gpt4 key购买 nike

更新:我用一个很棒的外部库解决了这个问题 - https://code.google.com/p/xdeltaencoder/ .我这样做的方式作为接受的答案发布在下面

假设我有两台独立的电脑,它们都有相同的 byte[] A。

其中一个 pc 创建 byte[] B,它几乎与 byte[] A 相同,但是是一个“较新”的版本。

为了让第二台电脑将他的 byte[] A 副本更新为最新版本 (byte[] B),我需要将整个 byte[] B 传输到第二台电脑。如果 byte[] B 的大小有很多 GB,这将花费很长时间。

是否可以创建一个 byte[] C 作为 byte[] A 和 byte[] B 之间的“差异”? byte[] C 的要求是知道 byte[] A,就可以创建 byte[] B。

那样的话,我只需要将 byte[] C 传输到第二台 PC,理论上这只是 byte[] B 大小的一小部分。

我正在寻找 Java 中这个问题的解决方案。

非常感谢您提供的任何帮助:)

编辑:在大多数情况下,数据更新的本质是将额外的字节插入数组的某些部分。当然,某些字节可能会被更改或某些字节被删除。 byte[] 本身代表目标 pc 上所有文件/文件夹的名称树。 byte[] 最初是通过创建自定义对象树、使用 JSON 编码它们,然后使用 zip 算法压缩该数据来创建的。我正在努力创建一种可以智能地创建对象 c 的算法。

EDIT 2:非常感谢大家给予的帮助,很抱歉这么长时间没有 Activity 。我很可能会尝试获取外部库来为我进行增量编码。这个线程的一个重要部分是我现在知道我想要实现的目标是什么!我相信,当我找到合适的解决方案时,我会发布并接受它,以便其他人可以看到我是如何解决我的问题的。再次非常感谢您的帮助。

最佳答案

使用“更改事件”的集合而不是发送整个数组

对此的解决方案是发送一个描述更改的序列化对象,而不是重新发送实际数组。

public class ChangePair implements Serializable{
//glorified struct
public final int index;
public final byte newValue;

public ChangePair(int index, byte newValue) {
this.index = index;
this.newValue = newValue;
}

public static void main(String[] args){

Collection<ChangePair> changes=new HashSet<ChangePair>();

changes.add(new ChangePair(12,(byte)2));
changes.add(new ChangePair(1206,(byte)3));

}
}

生成“变化事件”

实现这一目标的最有效方法是随时跟踪更改,但假设这不可能,您可以强行通过,找出哪些值不同

public static Collection<ChangePair> generateChangeCollection(byte[] oldValues, byte[] newValues){
//validation
if (oldValues.length!=newValues.length){
throw new RuntimeException("new and old arrays are differing lengths");
}

Collection<ChangePair> changes=new HashSet<ChangePair>();

for(int i=0;i<oldValues.length;i++){
if (oldValues[i]!=newValues[i]){
//generate a change event
changes.add(new ChangePair(i,newValues[i]));
}
}

return changes;
}

发送和接收那些更改事件

根据 this answer regarding sending serialized objects over the internet然后您可以使用以下代码发送您的对象

Collection<ChangePair> changes=generateChangeCollection(oldValues,newValues);

Socket s = new Socket("yourhostname", 1234);
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(objectToSend);
out.flush();

在另一端你会收到对象

ServerSocket server = new ServerSocket(1234);
Socket s = server.accept();
ObjectInputStream in = new ObjectInputStream(s.getInputStream());
Collection<ChangePair> objectReceived = (Collection<ChangePair>) in.readObject();
//use Collection<ChangePair> to apply changes

使用那些改变事件

然后可以简单地使用这个集合来修改另一端的字节数组

public static void useChangeCollection(byte[] oldValues, Collection<ChangePair> changeEvents){
for(ChangePair changePair:changeEvents){
oldValues[changePair.index]=changePair.newValue;
}
}

关于java - 仅通过文件之间的差异更新数据(java 的增量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21330954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com