比较两个DataInputStream的结尾

时间:2011-08-22 15:09:57

标签: java eclipse blackberry compare datainputstream

我必须创建一个在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;
          }
      }
}

效果很好,但需要很长时间才能运行。

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

3 个答案:

答案 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文件和迷你文件,并在设备上覆盖它们。