简单的Servlet,tomcat启动将数据加载到内存中去

版权声明:本文为博主原创文章,未经博主允许不得转载。 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'


根据自己的业务需求去调整

猜你喜欢

转载自blog.csdn.net/liujun_for_java/article/details/78223464