2011-08-22 57 views
0

我必須創建一個應用程序來檢索Web上的xml文件,並將它存儲在Blackberry手機中的SD卡上。 xml文件由cron作業更新。因此,如果數據已添加到此xml文件,我希望應用程序下載新的xml文件。比較兩個DataInputStream的結尾

現在我比較使用這段代碼

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

如果您找不到讀取文件末尾的方法: 也許可以創建另一個包含您想要讀取的結尾的「mini」文件。 因此,例如,如果您想要讀取最後一個X字節,則創建一個新文件並在其中寫入最後一個X字節。不用說,每次XML文件被cron作業創建/更新時,都需要創建/更新包含最後X個字節的這個文件。

在設備上,您同時存儲The XML和「mini」文件。 但現在您可以在上面激活您的方法,將流發送到服務器和設備上的「迷你」文件。如果您發現它們不相同,則可以下載XML文件以及迷你文件,然後在設備上覆蓋它們。

+0

謝謝!例如,我將簡單地創建2個或3個最後一個條目的un文件並比較它:D – bulby97

2

爲什麼不在服務器上創建包含最新更改日期的文件?然後,您的Java應用程序只下載小文件,並根據其內容決定是否必須下載整個xml文件。或者這不是一種選擇?

+0

+1;其他方法可用,例如,在XML根節點中定義版本屬性或生成校驗和(例如MD5)並將其存儲在XML或其他文件中。 – home

+0

感謝您的快速回復。問題在於xml文件由cron作業更新,但不一定在添加時進行。 cron作業每天都在運行,因此包含最新更改日期的文件每天都會更新。對於MD5或版本屬性也是如此。 – bulby97

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... 
    } 
} 
+0

下載文件的時間要比重寫它少得多。在我的情況下,下載文件需要3秒,但重寫需要10到20秒。 而我並沒有真正比較存儲在SD卡上的兩個XML文件。我比較兩個DataInputStream,第一個使用FileConnection,另一個使用HttpConnection – bulby97