我必须创建一个应用程序来检索web上的xml文件,并将其存储在黑莓手机的SD卡上。xml文件由cron作业更新。所以我想让应用程序下载新的xml文件,如果数据已经添加到这个xml文件。
现在我用这段代码
比较所有的数据文件public static boolean isSame( DataInputStream input1, DataInputStream input2 ) throws IOException {
boolean error = false;
try {
byte[] buffer1 = new byte[1024];
byte[] buffer2 = new byte[1024];
try {
int numRead1 = 0;
int numRead2 = 0;
while (true) {
numRead1 = input1.read(buffer1);
numRead2 = input2.read(buffer2);
if (numRead1 > -1) {
if (numRead2 != numRead1) return false;
// Otherwise same number of bytes read
if (!Arrays.equals(buffer1, buffer2)) return false;
// Otherwise same bytes read, so continue ...
} else {
// Nothing more in stream 1 ...
return numRead2 < 0;
}
}
} finally {
input1.close();
}
} catch (IOException e) {
error = true; // this error should be thrown, even if there is an error closing stream 2
throw e;
} catch (RuntimeException e) {
error = true; // this error should be thrown, even if there is an error closing stream 2
throw e;
} finally {
try {
input2.close();
} catch (IOException e) {
if (!error) throw e;
}
}
}
它工作得很好,但是需要很长时间来运行。
那么是否可以读取文件的末尾来查看是否做了更改,如果是,重新下载它?
为什么不在服务器上创建一个包含最新更改日期的文件呢?然后Java应用程序只下载小文件,并根据其内容决定是否必须下载整个xml文件。或者这不是一种选择吗?
如果你找不到读取文件末尾的方法:也许可以创建另一个包含您想要读取的结尾的"迷你"文件。例如,如果您想读取最后X字节,那么创建一个新文件并将最后X字节写入其中。不用说,每次由cron作业创建/更新XML文件时,都需要创建/更新这个包含最后X字节的文件。
在设备上,您存储XML和"迷你"文件。但是现在您可以在流上激活上面的方法,这些流可以在服务器和设备上找到"迷你"文件。如果发现它们不相等,则下载XML文件和迷你文件,并在设备上覆盖它们。
我对你的用例的理解是,你比较设备(黑莓)本身的XML文件,所以在比较之前,你总是下载文件到设备。
如果上面的假设是正确的,我看不出有任何理由比较文件。只需将本地文件替换为(可能)新的服务器文件,您的工作就完成了。
基于@bulby97注释编辑:
为什么不提供一个服务来回答客户端是否下载新文件的问题(伪代码):
服务器端boolean retrieveNewFile(int clientVersion) {
int serverVersion = getServerVersion();
if (clientVersion < serverVersion) {
return true;
}
return false;
}
客户端download() {
int clientVersion = getClientVersion();
boolean download = SERVER.retrieveNewFile(clientVersion);
if (download) {
// perform download...
}
}