package y.b;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;public class mainActivity extends Activity { Button b;
OutputStream output;// 输入出流
ProgressBar bar; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b = (Button) findViewById(R.id.btn);
bar = (ProgressBar) findViewById(R.id.bar);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
down();
}
});
} Handler handler = new Handler() { @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what) {
case 0:
bar.setVisibility(View.VISIBLE);
break;
case 1:
bar.setProgress(msg.arg1);
break;
case 2:
bar.setVisibility(View.GONE);
break;
}
}
}; // 下载方法 必须放在单独的线程里
private void down() throws RuntimeException {
new Thread(new Runnable() {
@Override
public void run() {
try {
Message m = handler.obtainMessage();
m.what = 0;
m.sendToTarget();
// 创建URL 写入下载地址
URL url = new URL("http://10.0.2.2:8080/dem/untitled.bmp");
// 创建HttpURLConnection
HttpURLConnection urlcon = (HttpURLConnection) url
.openConnection();
// 获得文件大小
// long TotalSize = Long.parseLong(urlcon
// .getHeaderField("Content-Length"));
// 获得文件大小
int fileLength = urlcon.getContentLength();
// 获得输入流
InputStream is = urlcon.getInputStream();
// 创建文件
File file = new File("/mnt/sdcard/untitled.bmp");
// 如果存在则删除
if(file.exists())
file.delete();
// 创建文件
file.createNewFile();
// 创建文件输入流
output = new FileOutputStream(file);
byte buffer[] = new byte[4 * 1024];
// 已下载
int downsize = 0; while(true) {
int down = is.read(buffer);
if(down == -1) {
break;
}
downsize += down;
output.write(buffer);
Message m2 = handler.obtainMessage();
m2.what = 1;
// 提示已下载百分之多少
m2.arg1 = downsize * 100 / fileLength;
m2.sendToTarget();
}
// 清除缓存
output.flush();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
try {
// 关闭输出流
output.close();
}
catch(Exception e) {
e.printStackTrace();
}
Message m2 = handler.obtainMessage();
m2.what = 2;
m2.sendToTarget();
}
}
}).start();
}
}运行起来没有任何问题
但是下载完成后文件一定损坏无法打开
解决方案 »
- 【求助醒目:关于APK在IIS服务器下载问题】
- 为什么继承自SurfaceView的类不能重写onDraw函数?
- 纸炮打怪这个游戏的背景是一张纸,怎么做的?
- 新手问题,感谢大侠解惑!
- 关于GridView Scroll时非正常切换Image的问题
- 问问.mk文件中的赋值符号 := 与+=
- android gridview 出现的不正常现象 (在线等到)
- Eclipse工具中,如何取消编辑器框中函数注释。(通常鼠标放在函数名上就会显示)
- ScrollView can host only one direct child
- SimpleAdapter不能自动更新 求解释
- 【求解决办法】电脑配置ADT老是出错
- 关于PuzzleView
is=c.getInputStream();
fos=new FileOutputStream(file);
byte[] buffer=new byte[1024*100];
while((length=is.read(buffer))>0){
fos.write(buffer, 0, length);
sum+=length;
}
while((down=is.read(buffer) > 0) {
downsize += down;
output.write(buffer, 0, down);
Message m2 = handler.obtainMessage();
m2.what = 1;
//提示已下载百分之多少
m2.arg1 = downsize * 100 / fileLength;
m2.sendToTarget();
}最主要是这一句 output.write(buffer);
改成output.write(buffer, 0, down);
因为假设你每次读40kb的数据 对于一个76kb的文件来说 最后一次读取buffer里面只有76-40=36kb而已
然而你依然网文件里面写入40kb的数据 导致文件末尾有4kb的空白数据 实际上有时候会影响文件的读取的 不过至少文件还是一个包含完整数据的文件