把被下载的文件缓存在内存中供用户下载,提高响应速度,降低硬盘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;
}
}
通过以上三个步骤就可以实现将多个文件缓存在内存中,供用户下载了,这样下载的时候就不用去读硬盘了,直接从内存读取,这样可以提高系统相应速度.
第一次写博客,请多指教.
分享到:
相关推荐
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 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
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 小结...
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 小结...
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 小结...
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。 9. 说下Struts的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...