下載時可以正常下載,但是下載后得到的文件不可用
不如下載一張圖片,在下載的目錄中能找到下載的文件,大小也是正確的,但是這張圖片卻打不開,提示無法加載此圖片,
或者下載一個app,找到下載的app卻不能正常安裝提示安裝包解析錯誤
是不是,這種下載模式會導(dǎo)致下載的文件損壞呀
下面是讀和寫的代碼
不如下載一張圖片,在下載的目錄中能找到下載的文件,大小也是正確的,但是這張圖片卻打不開,提示無法加載此圖片,
或者下載一個app,找到下載的app卻不能正常安裝提示安裝包解析錯誤
是不是,這種下載模式會導(dǎo)致下載的文件損壞呀
下面是讀和寫的代碼
舉報
2017-10-11
將InputStream換成BufferedInputStream,初始化bis=new BufferedInputStream(connection.getInputStream());? ?其余的不變
2016-12-08
補(bǔ)充
/**
* 下載線程
*/
class DownloadThread extends Thread {
private ThreadInfo threadInfo; // 線程信息
// public boolean isFinished = false;
public DownloadThread(ThreadInfo threadInfo) {
this.threadInfo = threadInfo;
Log.i(tag, "thread info = " + threadInfo);
}
@Override
public void run() {
URL url = null;
HttpURLConnection con = null; // http鏈接
RandomAccessFile accessFile = null; // 下載文件
InputStream inputStream = null; // 輸入流
try {
int start = threadInfo.getStart() + threadInfo.getFinished(); // 讀取文件的位置
// int startPos = blockSize * (threadId - 1);//開始位置 ?
// int endPos = blockSize * threadId - 1;//結(jié)束位置?
?
// start 初始化下載鏈接
url = new URL(threadInfo.getUrl());
con = (HttpURLConnection) url.openConnection();
con.setAllowUserInteraction(true); ?
con.setRequestMethod("GET");
con.setConnectTimeout(5000);
con.setRequestProperty("Range", "bytes=" + start + "-"
+ threadInfo.getEnd()); // 設(shè)置讀取文件的位置,和結(jié)束位置
// end 初始化下載鏈接
// start 初始化下載到本地的文件
accessFile = new RandomAccessFile(new File(
mTaskInfo.getFilePath(), mTaskInfo.getFileName()),
"rwd");
accessFile.seek(start); // 設(shè)置開始寫入的位置
// end 初始化下載到本地的文件
int responseCode = con.getResponseCode();
if ((con.getResponseCode() == HttpURLConnection.HTTP_PARTIAL)
|| (con.getResponseCode() == HttpURLConnection.HTTP_OK)) {
inputStream = con.getInputStream();
int finished = threadInfo.getFinished(); // 已經(jīng)下載的長度
// int len = threadInfo.getEnd()-threadInfo.getStart();
// //本線程要下載的長度
int readLen = -1; // 讀取的長度
byte[] buffer = new byte[1024 * 4];
long time = System.currentTimeMillis();
// start 讀取輸入流寫入文件
while ((readLen = inputStream.read(buffer)) != -1) {
accessFile.write(buffer, 0, readLen);
// Log.i(tag, "readLen = " + readLen);
finished += readLen;
threadInfo.setFinished(threadInfo.getFinished()+readLen); // 設(shè)置已經(jīng)下載進(jìn)度
if (System.currentTimeMillis() - time > 2000) {
// Log.i(tag, "readLen = " + readLen);
notifyProgress(threadInfo.getId(), threadInfo.getFinished()); // 每隔2秒通知下載進(jìn)度
time = System.currentTimeMillis();
}
// start 停止下載,保存進(jìn)度
if (isPause) {
Log.i(tag,
"pause name = " + mTaskInfo.getFileName());
notifyProgress(threadInfo.getId(), threadInfo.getFinished()); // 通知下載進(jìn)度
mThreadDao.updateThread(threadInfo.getUrl(),
threadInfo.getId(), threadInfo.getFinished()); // 更新數(shù)據(jù)庫對應(yīng)的線程信息
return;
}
// end 停止下載,保存進(jìn)度
}
// end 讀取輸入流寫入文件
// mThreadDao.updateThread(threadInfo.getUrl(),threadInfo.getId(),finished);
// isFinished = true;
// checkIsAllThreadFinished();
// broadcastFinished(threadInfo.getId(),finished);
notifyProgress(threadInfo.getId(), finished);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (accessFile != null) {
accessFile.close();
}
if (null != con) {
con.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
super.run();
}
}