【发布时间】:2011-11-16 04:19:18
【问题描述】:
我正在构建一个 Android 应用程序,我需要从一个 33 MB 大的 url 下载文件。
这里是下载任务:
try {
int MAX_BUFFER_SIZE = 4096;
URL mUrl = new URL(params[0]);
HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection();
connection.setRequestMethod("GET");
long length = connection.getContentLength(), downloaded = 0;
int read;
byte [] buffer = new byte[(((int)length) > MAX_BUFFER_SIZE) ? MAX_BUFFER_SIZE : (int)length];
String filename = getFilename(mUrl);
File file = new File (SDCARD_ROOT);
if (!file.exists() || !file.isDirectory()){
file.mkdir();
}
this.filename = filename;
file = new File (SDCARD_ROOT + this.filename);
FileOutputStream fos = new FileOutputStream (file);
//Start downloading
InputStream stream = connection.getInputStream();
while ((read=stream.read(buffer)) > -1){
fos.write(buffer, 0, read);
downloaded += read;
publishProgress((int) ((float) downloaded/length * 100));
}
fos.close();
return 1;
} catch (Exception e){
Log.e("REV-PARTS", "Revolver parts error in DownloadTask: " + e.getMessage());
return 2;
}
它适用于小文件 (1-15 MB),但对于大文件,它会返回“意外的流结束”异常。
【问题讨论】:
-
哪个调用会引发异常?
stream.read()? -
@Gnufabio 你能解决这个问题吗?
-
发件人意外关闭了连接。除了删除部分下载之外,您对此无能为力。注意你不需要计算缓冲区大小的所有垃圾。只需使用 8192。将其与数据大小相关联没有任何优势。您的代码仍然可以工作。
-
你有什么答案吗?你能帮我吗
-
这似乎是 Android Emulator for Windows 中的一个错误。在 Mac OS 上的 Device 和 Android Emulator 中同样可以正常工作
标签: java android download inputstream