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();
    }
}运行起来没有任何问题
但是下载完成后文件一定损坏无法打开

解决方案 »

  1.   

                            URLConnection c=new URL(url).openConnection();
    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;
    }
      

  2.   

    int down = 0;
    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);
      

  3.   

    output.write(buffer);这句代码是绝对有问题的
    因为假设你每次读40kb的数据  对于一个76kb的文件来说   最后一次读取buffer里面只有76-40=36kb而已
    然而你依然网文件里面写入40kb的数据  导致文件末尾有4kb的空白数据  实际上有时候会影响文件的读取的  不过至少文件还是一个包含完整数据的文件