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();
}
}
}
<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"/>