我必须创建一个在Web上检索xml文件的应用程序,并将其存储在Blackberry手机的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;
}
}
}
效果很好,但需要很长时间才能运行。
那么是否可以读取文件的末尾以查看是否进行了更改,如果是,请重新下载?
答案 0 :(得分:2)
为什么不在服务器上创建包含最新更改日期的文件?然后,您的Java应用程序只下载小文件,并根据其内容决定是否必须下载整个xml文件。或者不是一个选择?
答案 1 :(得分:0)
我对您的用例的理解是您比较设备(黑莓)本身的XML文件,因此在比较之前,您始终将文件下载到设备。
如果上述假设为真,我看不出任何理由比较文件。只需用(可能的)新服务器flie替换本地文件,即可完成工作。
根据@ 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...
}
}
答案 2 :(得分:0)
如果您没有找到读取文件末尾的方法: 也许有可能创建另一个“迷你”文件,其中包含您想要阅读的结尾。 因此,例如,如果要读取最后的X个字节,则创建一个新文件并在其中写入最后的X个字节。不言而喻,每次由cron作业创建/更新XML文件时,都需要创建/更新包含最后X字节的文件。
在设备上,存储XML和“迷你”文件。 但现在您将上面的方法在流上激活到服务器和设备上的“迷你”文件。如果发现它们不相等,则同时下载XML文件和迷你文件,并在设备上覆盖它们。