`

利用struts2下载缓存于内存中的文件

阅读更多

把被下载的文件缓存在内存中供用户下载,提高响应速度,降低硬盘I/O负担.通过一段时间的资料查找终于将这个问题给搞定了.

1.将文件缓存与内存中,大致代码如下.

 

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;


public class GameFileCache {
	public static HashMap<String,byte[]> MAP_DOWNLOAD = new HashMap<String,byte[]>();
	
	/**
	 * 将文件以byte数组的方式缓存于内存中.因为byte[] 数组有长度限制,所以最大的缓存字节数为int类型的最大值
	 * @param filePath	文件路径
	 * @param key		byte数组在map中对应的key
	 */
	public static void readFileToMemory(String filePath,String key){
		File file = new File(filePath);
		Long fileLength = file.length();
		try {
			byte[] filecontent = new byte[fileLength.intValue()];
			DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
			in.read(filecontent);
			MAP_DOWNLOAD.put(key, filecontent);
			in.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 将byte数组转为inputstream
	 * @param in
	 * @return
	 */
	public static InputStream byteToInputStream(byte[] in){
		ByteArrayInputStream is = new ByteArrayInputStream(in);
		return is;
	}
		
}
 

 

2.配置struts的下载xml,这里只贴出下载类的配置.这里下载时候的文件名字是写的固定的,当然也可以写成动态的,至于怎么写成动态的,百度一下是很多的.

 

<result name="getGameFile" type="stream">
				<param name="contentType">application/octet-stream</param>
				<param name="inputName">inputStream</param>
				<param name="contentDisposition">attachment;filename="XXX.XX"</param>
				<param name="bufferSize">4096</param>
</result>

 

 3.配置完成以后贴出下载的action方法

 

import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class GameDownloadAction extends ActionSupport implements ServletContextAware,	ServletRequestAware {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	HttpServletRequest request;
	private String fileName;	//渠道名称
	private byte[] in;
	
	public String formateString(String str){
		if(null == str){
			return "";
		}
		return str.trim();
	}
	
	/**
	 * 下载文件
	 * @return
	 */
	public String getGameFile(){
		if(GameFileCache.MAP_DOWNLOAD.size() > 0){
			if(!fileName.isEmpty()){
				in = GameFileCache.MAP_DOWNLOAD.get(fileName);	//获取缓存中的文件
			}
		}
		return "getGameFile";
	}
	
	/**
	 * 将文件缓存到内存中,渠道名称就是缓存到内存中的文件key值.filepath就是文件在硬盘中的路径
	 */
	public void setGameFile(){
		String channle = formateString(request.getParameter("channel"));	//渠道名称
		String filePath = formateString(request.getParameter("file"));		//文件路径
		GameFileCache.readFileToMemory(filePath, channle);
	}

	public InputStream getInputStream() throws Exception{
		return GameFileCache.byteToInputStream(in);
	}
	
	public void setServletContext(ServletContext arg0) {
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	
	
}
 

 

通过以上三个步骤就可以实现将多个文件缓存在内存中,供用户下载了,这样下载的时候就不用去读硬盘了,直接从内存读取,这样可以提高系统相应速度.

第一次写博客,请多指教.

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 字符串模式匹配  17.2.4 逻辑运算  17.2.5 集合运算  17.3 小结...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 字符串模式匹配  17.2.4 逻辑运算  17.2.5 集合运算  17.3 小结...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 字符串模式匹配  17.2.4 逻辑运算  17.2.5 集合运算  17.3 小结...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 字符串模式匹配  17.2.4 逻辑运算  17.2.5 集合运算  17.3 小结...

    Spring面试题

    在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。 9. 说下Struts的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm...

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包10

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包11

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包3

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java开源包6

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包5

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包4

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包8

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包7

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包9

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包101

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

Global site tag (gtag.js) - Google Analytics