客户端用流下载文件到SD卡

Server端的文件流操作

首先用Servlet搭建一个简单的服务器,并用Tomcat部署起来,Servlet读取一个文件流并通过response返回响应,设置MIME等响应头信息,代码如下:

package jim.client_server_data_exchange.servlet;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DownloadServlet
 */
@WebServlet("/download.do")
public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println("---get---");
		InputStream in = null;
		OutputStream out = null;
		try {
			//可以是你硬盘中的任何文件
			File file = new File("D:\\第一行代码——Android_郭霖.pdf");
			System.out.println(file + "");
			// 根据路径得到输入流并用buffer包装起来,加快读取速度用
			in = new BufferedInputStream(new FileInputStream(file));
			byte b[] = new byte[1024];
			// 设置返回类型,二进制类型
			response.setContentType("application/octet-stream");
			// 设置文件长度
			response.setContentLength((int) (file.length()));
			response.setCharacterEncoding("UTF-8");
			// 下面句是用来测试网页打开时是否有响应
			// response.addHeader("Content-Disposition",
			// "attachment;filename="+file.getName());
			out = new BufferedOutputStream(response.getOutputStream());
			int read = 0;
			// 通过byte[]把输入流转成输出流
			while ((read = in.read(b)) != -1) {
				out.write(b, 0, read);
			}
		} catch (Exception e) {

			e.printStackTrace();
			
		} finally {
			if (in != null) {
				in.close();
			}
			if (out != null) {
				out.close();
			}

		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		doGet(request, response);
	}

}

客户端就收流并写到SD卡
客户端请求得到response,取出文件流然后写到SD卡中,用到的是get请求。
界面只有一个按纽,点击开始下载,这是Activity中的代码
package com.Jim.service;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.Jim.logintest.R;

/**
 * Created by Jim Huang on 2015/8/15.
 */
public class DownloadActivity extends Activity {
    private Button btnDownload;
    private UserService userService=new UserServiceImpl();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);
        btnDownload=(Button)findViewById(R.id.btn_download);
        btnDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //使用progressDialog显示下载
                final ProgressDialog dialog=new ProgressDialog(DownloadActivity.this);
                dialog.setTitle("下载文件");
                dialog.setMessage("正在下载");
                dialog.setCancelable(false);
                dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                dialog.show();

                //开启线程开始下载
                    new Thread(new Runnable() {

                        @Override
                        public void run() {

                            try {
                                //下载的方法在这里
                                userService.userDownload();
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(DownloadActivity.this,"下载完成",Toast.LENGTH_SHORT).show();
                                    }
                                });

                            }catch (final ServiceRulesException e){
                                e.printStackTrace();
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(DownloadActivity.this,e.getMessage(),Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                            catch (Exception e){
                                e.printStackTrace();
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(DownloadActivity.this,"下载失败",Toast.LENGTH_SHORT).show();
                                    }
                                });

                            }finally {
                                //最后把progressdialog关闭
                                dialog.dismiss();
                            }

                        }
                    }).start();
            }
        });
    }
}

请求下载的方法如下,用到的方法是HttpURLConnection
public void userDownload() throws Exception {
        InputStream in = null;
        OutputStream out = null;
        try {

            /**
             * 如果用HttpClient,可以用如下方法得到输入流
             * HttpClient client=null;
             * HttpResponse response=client.execute(get);
             * in=response.getEntity().getContent();
             * 
             */
            
            //这里是我服务器的地址
            URL url = new URL("http://10.198.1.44:8080/maizi/download.do");
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setReadTimeout(5000);
            //有了这句才能从服务器下载读取内容
            urlConnection.setDoInput(true);
            urlConnection.setConnectTimeout(5000);
            urlConnection.connect();

            //得到响应码
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                in = new BufferedInputStream(urlConnection.getInputStream());
                byte b[] = new byte[1024];
                int read = 0;
                out = new BufferedOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory() + "/第一行代码——Android_郭霖.pdf"));
                while ((read = in.read(b)) != -1) {
                    out.write(b, 0, read);
                }
            } else {
                //这里是我继承Exception的一个类,可以直接抛出异常
                throw new ServiceRulesException("Server Error");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }


    }

最后在Manifest文件中不要忘了加上权限,这样就可以实现下载文件了。
 <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值