“如何检测”;“下载一半”;Java/Android中的文件
我正在尝试在我的应用程序中处理一些文件的下载。基本上,我会在需要时下载一个文件并向用户显示“如何检测”;“下载一半”;Java/Android中的文件,java,android,Java,Android,我正在尝试在我的应用程序中处理一些文件的下载。基本上,我会在需要时下载一个文件并向用户显示 我还想把下载的文件作为缓存,所以我在URL上使用哈希,当地图与现有文件发生冲突时,我认为它是缓存命中。< /P> 我的伪代码是: String filename = hash(url); File outputFile = new File(cacheFolder,filename); if(!outputFile.exists()){ download(url,outputFile); } ret
我还想把下载的文件作为缓存,所以我在URL上使用哈希,当地图与现有文件发生冲突时,我认为它是缓存命中。< /P> 我的伪代码是:
String filename = hash(url);
File outputFile = new File(cacheFolder,filename);
if(!outputFile.exists()){
download(url,outputFile);
}
return outputFile;
我用来从url下载文件的代码是
URL url = new URL(urlToDownload);
URLConnection connection = url.openConnection();
connection.connect();
// this will be useful so that you can show a typical 0-100% progress bar
int fileLength = connection.getContentLength();
// download the file
InputStream input = new BufferedInputStream(connection.getInputStream());
OutputStream output = new FileOutputStream(outputFile.getAbsolutePath());
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
它工作得很好,但我在检测以下情况时遇到了问题:
- 应用程序开始下载一个文件,当部分写入时,用户会终止应用程序,使输出文件处于不一致的状态
- 用户重新打开应用程序,我检测到文件存在,但无法检测到文件已损坏,因此我尝试打开文件,但失败
谢谢我看到两个选项,无论如何都要加载它,这样您就可以知道它是否会因为失败而损坏,另一个选项是检查文件大小,但您需要将原始大小分开存储。下载到临时文件,然后将其移到最终位置。完全没有开销。你的应用程序如何引用下载的文件?它必须有一个它认为可以打开的文件列表,这只是“文件夹中的所有文件”还是下载文件的查找列表(数据库)?如果您有一个列表,那么您可以添加一个标记属性,例如“DownloadComplete”,它仅在成功下载结束时设置。或者你可以使用临时文件名进行下载,然后在下载完成后重命名。用户重新打开应用程序时,我检测到该文件存在,但无法检测到该文件已损坏,因此我尝试打开该文件,但失败。如果正确填写
内容长度
,您可以检查存储的文件大小和字段之间的差异是否使用MD5验证?要看的东西: