版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liujun_for_java/article/details/78223464
要求:写一个简单的servlet,要求tomcat启动将文件加载到内存中去,
浏览器localhost:8080/download.do?file=文件名
实现文件下载,文件夹中只有文件没有多余的文件夹
思路:tomcat启动加载文件所在目录,读取文件夹中的文件,将文件转换成字节数组,将字节数组以key,value的形式存储到map中,下在文件时根据文件名的key获取value,再将字节数组转换为文件,进行下载
具体实现的代码:
1.文件转换成字节的工具类:
import java.io.*; /** * Created by Admin on 2017/10/13. */ public class FileUtil { /** * 获得指定文件的byte数组 */ public static byte[] getBytes(File file){ byte[] buffer = null; try { FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); byte[] b = new byte[1000]; int n; while ((n = fis.read(b)) != -1) { bos.write(b, 0, n); } fis.close(); bos.close(); buffer = bos.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer; } }2.具体代码的实现:
import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.HashMap; import java.util.Map; /** * Created by Admin on 2017/10/13. */ public class DownLoad extends HttpServlet { private Map<String, byte[]> fileBytes = new HashMap<>(); @Override public void init() throws ServletException { ServletContext servletContext = this.getServletContext(); String dataPath = servletContext.getInitParameter("DataPath"); File f = new File(dataPath); File fa[] = f.listFiles(); for (int i = 0; i < fa.length; i++) { File fs = fa[i]; if (fs.isDirectory()) { System.out.println(fs.getName() + " [目录]"); } else { System.out.println(fs.getName()); byte[] bytes = FileUtil.getBytes(fs); fileBytes.put(fs.getName(),bytes); } } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String file = req.getParameter("file"); byte[] data = fileBytes.get(file); // fileName = URLEncoder.encode(fileName, "UTF-8"); file = new String(file.getBytes(), "ISO-8859-1");//浏览器下载文件名为中文时 解决中文乱码的代码 resp.reset(); resp.setHeader("Content-Disposition", "attachment; filename=\"" + file + "\""); resp.addHeader("Content-Length", "" + data.length); resp.setContentType("application/octet-stream;charset=UTF-8"); OutputStream outputStream = new BufferedOutputStream(resp.getOutputStream()); outputStream.write(data); outputStream.flush(); outputStream.close(); resp.flushBuffer(); } @Override public void destroy() { super.destroy(); } }3.web.xml文件的配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>download</servlet-name> <servlet-class>DownLoad</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>download</servlet-name> <url-pattern>/download.do</url-pattern> </servlet-mapping> <context-param> <param-name>DataPath</param-name> <param-value>C:/Users/Admin/Desktop/test</param-value> </context-param> </web-app>注意:设定tomcat服务器启动执行,所以添加
<load-on-startup>1</load-on-startup>
在实现功能的过程当中,遇到了一些问题:
java.lang.OutOfMemoryError: Java heap space
内存溢出
我加载的文件比较大,总共有900+M,在往内存加载的过程当中出现了内存溢出
调整tomcat的初始化堆内存和最大堆内存的大小
开发工具是IDEA在tomcat的配置中添加:
-Xms3072m -Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=256m
如果部署到linux服务器上则修改tomcat的配置文件bin目录下的catalina.sh文件
JAVA_OPTS='-Xms2048m -Xmx10240m'
根据自己的业务需求去调整