写了一个servlet下载文件的
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class downLoadFile extends HttpServlet { // 字符编码
private final String ENCODING = "GB2312"; // 内容类型
private final String CONTENT_TYPE = "text/html;charset=GB2312"; // 要下载的文件存放的路径
private String downloadFileDir = "E:/"; /**
 * 执行HTTP get操作
 * 
 * @param req
 *            从用户来的请求
 * @param resp
 *            servlet的回应
 */
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置request对象的字符编码
request.setCharacterEncoding(ENCODING);
// 从request 中取出要下载文件的名字
String fileName = request.getParameter("filename");
if (fileName == null || fileName.trim().equals("")) {
// 设置response对象ContentType
response.setContentType(CONTENT_TYPE);
// 输出错误信息
PrintWriter out = response.getWriter();
out.println("<font   color=red>输入的文件名无效!</font>");
out.close();
} else {
// 下载文件的完整路径名
String fullFileName = downloadFileDir + fileName;
System.out.println("下载文件:" + fullFileName);
String[] files = fullFileName.split("/");
int k = files.length;
System.out.println(k);
String file = "";
if (k == 1) {
file = files[0];
} else {
file = files[k - 1];
} System.out.println("下载文件:" + file);
// 根据文件的类型设置response对象ContentType
String contentType = getServletContext().getMimeType(fullFileName);
if (contentType == null)
contentType = "application/octet-stream";
response.setContentType(contentType);
response.setHeader("content-disposition", "attachment;filename=\""
+ file + "\"");
InputStream is = null;
OutputStream os = null;
try {
is = new BufferedInputStream(new FileInputStream(fullFileName));
// 定义输出字节流
java.io.ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 定义response的输出流
os = new BufferedOutputStream(response.getOutputStream());
// 定义buffer
byte[] buffer = new byte[4 * 1024];// 4k Buffer
int read = 0;
// 从文件中读入数据并写到输出字节流中 while ((read = is.read(buffer)) != -1) { baos.write(buffer, 0, read); }
System.out.println(baos.size());
// 将输出字节流写到response的输出流中
int i = 0; os.write(baos.toByteArray(), i, baos.size()); } catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭输出字节流和response输出流
os.close();
is.close();
}
} } public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 调用doGet方法
doGet(req, resp);
}
这样下载人多了,总会使内存泄漏,什么原因啊?怎么解决?