如何在下载之前检查URL中的重复文件

时间:2015-06-02 13:53:30

标签: java file url duplicates downloading

我的计算机上的文件夹中有成千上万的图像,我试图找出如何检查来自给定URL的文件是否已经下载。有可能吗?

这只给我文件的大小。

URL url = new URL("http://test.com/test.jpg");
url.openConnection().getContentLength();

对于我使用的重复文件

FileUtils.contentEquals(file1, file2)

感谢您的回答!

2 个答案:

答案 0 :(得分:2)

如果您有基本URL并存储具有相同文件名的文件。由于文件修改时间和If-Modified-Since HTTP Header,您可以询问服务器是否值得再次下载映像。

    File f = new File();// the file to download
    HttpURLConnection con = (HttpURLConnection) new URL("http://www.test.com/"+f.getName()).openConnection();
    // Add the IfModifiedSince HEADER
    con.setIfModifiedSince(f.lastModified());
    con.setRequestMethod("GET");
    con.connect();
    if(con.getResponseCode() == 304) {
        System.out.println(f+ " : already downloaded");
    } else {
        // Download the content again and store the image again
    }

如果自第一次下载以来本地文件的修改时间保持不变并且服务器支持IfModifiedSince标题,那么它将起作用。

如果您不知道如何匹配文件名和网址,那么就没有明显的方法了。

您可以使用快速HEAD请求进行一些实验并提取一些相关信息,例如:

  • 的Content-Length
  • 上次修改
  • 的ETag

内容长度+最后修改可能是一个很好的匹配。

对于ETags,如果您知道http服务器如何构建ETag,您可以尝试在您的旁边(在所有本地文件上)构建它并将其用作比较值。 有关ETag的一些信息:

不幸的是,ETag可以构造为仅对服务器可见的信息(inode编号),因此您无法重建它。

再次下载文件肯定会更容易/更快。

答案 1 :(得分:-2)

如果您不下载该文件,则无法将其与另一个文件进行比较。

否则,您可以将下载的内容存储在临时文件中:

File temp = new File(FileUtils.getTempDirectory(), "temp");
FileUtils.copyURLToFile(url, temp);

然后遍历现有文件并致电:

FileUtils.contentEquals(temp, existingFile)

最后,您需要保留或删除临时文件。

当然这不是很快。如果您有数千个文件,则可以将其哈希值保存在文件中,然后使用该文件而不是FileUtils.contentEquals