【问题标题】:Android: how to know file located in web server is modified?Android:如何知道位于 Web 服务器中的文件已被修改?
【发布时间】:2011-10-05 05:31:55
【问题描述】:

我正在解析位于 Web 服务器中的 Xml 文件并将解析的数据存储到数据库中。对于我的应用程序,我正在使用数据库中的数据。只有当文件被修改时,我才需要解析 xml 文件,否则不需要解析。那么我怎么知道文件被修改了呢?我知道我可以使用“if-modified-since”标头。但 我需要一些“if-modified-since”标头的示例
请帮帮我.......

【问题讨论】:

    标签: android file web-applications


    【解决方案1】:

    由于您是从 Web 服务器检索 .xml 文件,这应该相对容易,无需进行服务器端 MD5 求和。

    如果您正在对 xml 文件执行 HTTP 请求,您可以简单地从 Web 服务器执行 HEAD 请求,如果文件已更改/修改或不存在,这将返回。这也是轻量级的,最好的部分是服务器应该已经为您执行此操作。

    编辑:重新阅读您的问题,看来您的想法相同。这是代码。

    import java.net.*;
    import java.io.*;
    
    // Using HTTP_NOT_MODIFIED
    public static boolean Changed(String url){
        try {
          HttpURLConnection.setFollowRedirects(false);
          HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
          con.setRequestMethod("HEAD");
          return (con.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED);
        }
        catch (Exception e) {
           e.printStackTrace();
           return false;
        }
      }
    
    // GET THE LAST MODIFIED TIME
    public static long LastModified(String url)
    {
      HttpURLConnection.setFollowRedirects(false);
      HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
      long date = con.getLastModified();
    
      if (date == 0)
        System.out.println("No last-modified information.");
      else
        System.out.println("Last-Modified: " + new Date(date));
    
      return date;
    }
    

    见:

    或者,如果您的服务器支持它们,您可以使用 ETags 来确定您的文件是否已被修改。

    【讨论】:

    • 你好,你能把上面的方法解释清楚一点吗,即“如果上面的方法返回true表示文件被修改”?
    • 这确实使您严重依赖“最后修改”字段,该字段被滥用(* 我认为,如果我错了,请纠正我 *)强制无缓存和其他东西。跨度>
    • @Nanne - 理想情况下,您应该使用 etag,毕竟这就是它们的用途。尽管有时这不是一个可行的选项,即负载平衡的 IIS 服务器无法生成 etag 或从 CDN 检索 etag。静态文件如图片或 .xml 文件应该可以使用最后修改的字段。
    • 我的意思是,但我会是第一个管理员,我没有太多深入的知识,你应该相信服务器提供正确的数据。如果您可以节省时钟周期和流量来下载它和 md5,我认为您更有把握(但当然要付出明显的代价)。
    【解决方案2】:

    计算文件的MD5。可以保存旧的对比一下吗?

    如果您不知道如何操作,请查看以下示例:Getting a File's MD5 Checksum in Java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-26
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多