比较两个DataInputStream的结尾



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

相关内容

  • 没有找到相关文章

最新更新