0

我必须创建一个应用程序来检索 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;
          }
      }
}

它运行良好,但需要很长时间才能运行。

那么是否可以读取文件的末尾以查看是否进行了更改,如果是,请重新下载?

4

3 回答 3

2

为什么不在服务器上创建一个包含最新更改日期的文件?然后,您的 Java 应用程序只下载小文件,并根据其内容决定是否必须下载整个 xml 文件。或者那不是一个选择?

于 2011-08-22T15:15:09.613 回答
0

我对您的用例的理解是您比较设备(黑莓)本身上的 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...
    }
}
于 2011-08-22T15:24:11.723 回答
0

如果您找不到读取文件末尾的方法:也许可以创建另一个包含您要读取的结尾的“迷你”文件。因此,例如,如果您想读取最后 X 个字节,则创建一个新文件并将最后 X 个字节写入其中。不用说,每次 cron 作业创建/更新 XML 文件时,都需要创建/更新包含最后 X 个字节的文件。

在设备上,您存储 XML 和“迷你”文件。但是现在您在流到服务器和设备上找到的“迷你”文件上激活上面的方法。如果您发现它们不相等,则下载 XML 文件和迷你文件并在设备上覆盖它们。

于 2011-08-23T05:49:52.253 回答