0

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;
          }
      }
}

完全に機能しますが、実行に時間がかかります。

それで、ファイルの終わりを読んで、変更が加えられたかどうかを確認し、変更が加えられた場合は、それを再ダウンロードすることは可能ですか?

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バイトを書き込みます。言うまでもなく、最後のXバイトを含むこのファイルは、XMLファイルがcronジョブによって作成/更新されるたびに作成/更新する必要があります。

デバイスには、XMLファイルと「ミニ」ファイルの両方を保存します。ただし、サーバーとデバイスにある「ミニ」ファイルへのストリームで上記のメソッドをアクティブにします。それらが等しくないことがわかった場合は、XMLファイルとミニファイルの両方をダウンロードして、デバイス上でそれらをオーバーライドします。

于 2011-08-23T05:49:52.253 に答える