我有成千上万的图像在我的电脑上的文件夹,我正试图找出我如何能检查从给定的URL文件是否已经下载。这可能吗?
这只给我文件的大小。
URL url = new URL("http://test.com/test.jpg");
url.openConnection().getContentLength();
对于重复的文件,我使用
FileUtils.contentEquals(file1, file2)
谢谢你的回答!
如果您有一个基本URL并且存储具有相同文件名的文件。由于文件修改时间和if - modified - since HTTP报头,您可以询问服务器是否值得再次下载图像。
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头,则可以工作。
如果你不知道如何匹配文件名和URL,那么就没有明显的办法了。
您可以用快速HEAD请求做一些实验并提取一些相关信息,如:
- 内容长度
- last - modified
- ETag
Content-Length + Last-Modified可以很好地匹配。
对于ETag,如果你知道http服务器如何构建ETag,你可以尝试在你这边(在你所有的本地文件上)构建它,并将其用作比较值。关于ETags的一些信息:
- http://bitworking.org/news/150/REST-Tip-Deep-etags-give-you-more-benefits
- https://serverfault.com/questions/120538/etag-configuration-with-multiple-apache-servers-or-cdn-how-does-google-do-etag
不幸的是,ETag可以用仅对服务器可见的信息(inode号)构建,因此您不可能重新构建它。
再次下载你的文件肯定会更容易/更快。
如果你不下载文件,你就不能与其他文件进行比较。
否则,你可以将下载的内容存储在临时文件中:
File temp = new File(FileUtils.getTempDirectory(), "temp");
FileUtils.copyURLToFile(url, temp);
然后循环遍历现有文件并调用:
FileUtils.contentEquals(temp, existingFile)
最后,您可能想要保留或删除临时文件。
当然这不是很快。如果你有数千个文件,你可以将它们的哈希值保存在一个文件中,而不是使用FileUtils.contentEquals
。