2011-08-22 23 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