BSDiff是一个增量更新算法,它在服务器端运行BSDiff算法产生patch包。在客户端运行BSPatch算法,将旧文件和patch包合成新文件。增量更新在很多大型应用中是比较常见的一种技术,通过文件对比的方式来生成差分包。
bsdiff这个开源库连接:http://www.daemonology.net/bsdiff/
遍历搜索引擎,只发现BSPatch算法实现只有C语言源码,使得在Android等Java语言环境中,只能通过NDK的方式运行,非常不方便。
自己阅读了下BSPatch算法源码,发现并不复杂,完全可以用Java重新实现一下。另外吐槽一下,BSPatch算法的C语言源码main()主函数是真的好长,而且还用了err.h、fseeko、ftello这种windows上都没有的接口,难受。。。
以下为我实现的Java版BSPatch算法,并把函数拆分了一下,使得每个方法不超过40行,方便阅读。可直接调用
BSPatch.patch(oldPath, newPath, patchPath);
实现增量更新。源码依赖Apache的Commons Compress用以实现bzip2的解压,链接:http://commons.apache.org/proper/commons-compress/download_compress.cgi
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
public class BSPatch {
private RandomAccessFile mOld;
private OutputStream mNew;
private InputStream mPatch;
// 以下3个数据仅在patch()内有效
private InputStream bzCtrl;// 控制数据
private InputStream bzData;// 差分数据

最低0.47元/天 解锁文章
1948





