“如何检测”;“下载一半”;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验证?要看的东西: