把被下载的文件缓存在内存中供用户下载,提高响应速度,降低硬盘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;
}
}
通过以上三个步骤就可以实现将多个文件缓存在内存中,供用户下载了,这样下载的时候就不用去读硬盘了,直接从内存读取,这样可以提高系统相应速度.
第一次写博客,请多指教.
分享到:
相关推荐
"Spring+Struts+页面缓存+内存数据库+licence+proxool+EhCache" 的组合提供了一个强大的系统基础架构,便于快速开发和部署。接下来,我们将深入探讨这些组件及其在J2EE中的作用。 首先,Spring框架是Java应用的核心...
文件上传和下载是Web应用程序中的常见需求,Struts2提供了完善的机制来处理这些功能。在"Struts2文件动态上传和动态下载(可自动生成下载内容)"这个项目中,J-CN工作室提供了一个完整的MyEclipse工程源码,使得开发者...
导入这些jar包后,开发者可以利用Struts2的拦截器(Interceptor)机制实现缓存策略,通过自定义拦截器存储和检索缓存数据。同时,配置Struts2的XML配置文件(struts.xml或struts-default.xml)来指定哪些Action应该...
- **性能优化**:Struts 2在内存管理和缓存机制等方面进行了优化,提高了整体性能。 - **国际化支持**:Struts 2内置了对多语言的支持,使得创建多语言的应用程序变得更加简单。 ### 实战应用案例 为了更好地理解...
在IT行业中,SSH(Spring、Struts2、Hibernate)是一个经典的Java Web开发框架组合,而Redis则是一个高性能的键值存储系统,常用于缓存和数据持久化。将SSH与Redis整合,可以提升应用程序的性能和响应速度。下面将...
- **版本说明**:本书《Struts2 Design and Programming: A Tutorial》由Budi Kurniawan编写,出版于2008年1月25日,全书共576页,ISBN-10为0-9803316-0-9,ISBN-13为978-0-9803316-0-8。该书覆盖了Struts 2.0版本的...
Struts和Hibernate是两个在Java Web开发中广泛使用的框架,它们分别关注于应用程序的表示层(Presentation Layer)和持久化层(Persistence Layer)。Struts2是Struts的升级版,它引入了非侵入式设计,提高了灵活性...
### Struts2配置文件详解 ...本文列举了`struts.xml`中常用的配置项及其详细解释,希望能帮助开发者更好地理解和利用Struts2框架。在实际开发中,根据项目的具体需求灵活调整配置项的值,可以使得应用更加健壮和高效。
在Struts2框架中,配置文件`struts.properties`用于定义一系列重要的系统级配置项,这些配置项对框架的行为模式和功能实现起着至关重要的作用。本文将详细介绍该文件中几个关键配置项的功能及其用法。 #### 二、...
《基于JSP Struts 缓存的公司管理系统》是由曹广鑫、时强等作者设计与实现的一个企业级应用系统,它充分利用了JSP(JavaServer Pages)和Struts框架的优势,结合缓存技术,提高了系统的性能和响应速度。本文将深入...
在这个项目中,"SSi实现文件上传下载功能"主要是利用Struts2的Action类和拦截器来处理HTTP请求,Spring来管理服务层对象,以及iBatis来与数据库交互,存储和检索文件相关信息。以下是实现这些功能的关键知识点: 1....
总的来说,"Struts2整合JasperReport"的项目是一个典型的Java Web开发案例,展示了如何利用Struts2的MVC架构和JasperReport的报表能力,实现复杂报表的动态生成、分页和预览。通过学习这个项目,开发者可以深入理解...
在Struts2中实现下载功能是一项常见的需求,这通常涉及到处理HTTP响应、流媒体技术和文件存储策略。以下是对这个主题的详细解释: 一、Struts2框架基础 Struts2是基于MVC(Model-View-Controller)设计模式的框架,...
在IT行业中,Spring、Struts2和Hibernate是Java企业级应用开发中常见的三大框架,而Ehcache则是一个广泛使用的缓存解决方案。这篇博客“spring struts2 hibernate ehcache整合”显然探讨了如何将这四个组件集成到同...
Struts2提供了强大的文件上传支持,主要依赖于Apache的Commons FileUpload库。要实现文件上传,首先需要在Struts2配置中启用它,然后在Action类中定义一个`List<File>`或`File`类型的属性来接收上传的文件。用户...
第三种实践是利用Struts2的流结果类型(Stream Result)来直接输出图像流。这样,浏览器可以直接显示由服务器生成的图表,而无需先保存到服务器或客户端的硬盘上。 第四种方法是将图表作为附件提供下载。在Action中...
Struts2、Spring、Hibernate和MySql这四个技术是Java Web开发中常用的一套经典组合,被称为SSH框架。这个注册登录系统就是利用这些技术构建的。下面将详细讲解这套组合的相关知识点。 首先,Struts2是一个强大的MVC...
在Struts2中集成Hibernate,可以利用Struts2的Action来调用Hibernate的Service层,实现业务逻辑。首先,需要在Struts2的Action中注入Hibernate的SessionFactory,然后通过SessionFactory获取Session,执行CRUD操作。...
再者,Struts2的Result类型允许开发者定义不同类型的响应,如dispatcher(重定向或转发到一个JSP页面)、stream(处理文件下载)和freemarker(使用FreeMarker模板引擎)。2.3版本进一步增强了对这些Result类型的...
在本学生信息管理系统中,我们利用Struts2处理用户请求,通过Action类接收并处理前端提交的数据。例如,当用户请求分页浏览时,Action类会根据请求参数计算当前页码,然后调用Hibernate的Session查询接口,获取指定...