`
penua
  • 浏览: 18984 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

下载文件时,你有没有考虑临时文件已经一大堆了?

 
阅读更多

下载文件操作时,临时文件的处理可能是经常会碰到却又很容易忽略的问题,如果不仔细处理,很容易在服务器上遗留一堆的临时文件。

一般我们可能会这样做(在Struts2下的代码,其它环境也类似):

		// 下载文件
		try {
			stream = new FileInputStream(new File(downloadFile));		
			FileUtil.deleteFile(downloadFile);
		} catch (Exception e) {
			log.error("系统错误" + e.getMessage());
			throw new Exception(e.getMessage());
		}

  

然而,虽然写了 FileUtil.deleteFile(downloadFile);, 这句话却不能起任何作用,因为前面的Stream没有关闭,无法Delete。

 

为此,增加了一下函数。

 

	public static InputStream getDownloadFile(String realPath, byte[] fileContents) throws Exception {
		
		// 初始化Stream
		InputStream stream = null;
		
		// 判断参数
		if (realPath == null && fileContents == null) {
			throw new Exception("not found stream Contents");
		}

		// 处理模式判断
		if (realPath != null && !"".equals(realPath)) {
			// 文件模式
			
			try {
				// 读取文件到二进制中
				File readFile = new File(realPath);
				FileInputStream fis = new FileInputStream(readFile);
				
				// 读取
				byte[] buffer = new byte[(int)readFile.length()];
				fis.read(buffer);
				
				// 关闭
				fis.close();
				
				stream = new ByteArrayInputStream(buffer);
			} catch (FileNotFoundException e) {
				throw e;
			}
		} else {
			// 字节数组模式
			stream = new ByteArrayInputStream(fileContents);
		}
		
		return stream;
	}

  

代码也改为:

 

		// 下载文件
		try {
			stream = FileUtil.getDownloadFile(downloadFile, null);		
			FileUtil.deleteFile(downloadFile);
		} catch (Exception e) {
			log.error("系统错误" + e.getMessage());
			throw new Exception(e.getMessage());
		}

 

 即可正确的删除临时文件。

分享到:
评论
8 楼 zds625 2009-01-21  
在struts2实现上传的时候也会保存文件到临时目录,但是这个目录临时文件不会删除,不知大家是定时做删除处理还是怎样做呢?
7 楼 sdh5724 2009-01-14  
哈, DZ, 连G点。。。。
6 楼 gembler 2009-01-14  
sdh5724出爆击···哈哈
5 楼 sdh5724 2009-01-14  
如果你真想彻底, 就在finnaly里去做。
4 楼 sdh5724 2009-01-14  
如果你真想彻底, 就在finnaly里去做。
3 楼 penua 2009-01-14  
谢谢你们意见.

这确实是很常识性的问题,解决办法也很多, 不过在最近一个项目中,却因为忽略这个问题很久,最终导致临时文件一大堆了, 若没有及时删除, 硬盘随时有可能撑破..

2 楼 myy 2009-01-13  
这种临时文件完全可以集中放在一个固定目录,用后台的定时程序清理,根据具体情况定策略。
1 楼 ariesying 2009-01-12  
资源类的东东用完关闭应该是常识的吧。

相关推荐

    文件分类神器 DropIt 8.5.1 中文多语免费版.zip

    电脑用久了,办公文档、电子书、照片、下载的临时文件等堆满了硬盘,眼看着文件夹越来越庞大,其中的杂乱无章的文件该怎么整理呢?一个一个地移动到规划好的文件夹中?这么多文件,可要整理到什么时候啊?使用Dropit...

    八年PHP文件管理器 v2.6.2 免费版.rar

    使用文件备注功能会在根目录生成一个 8db 文件夹来保存数据不要删除 这个功能看上去简单 但是非常实用 只要使用好此功能 能方便的管理一大堆文件 包括可以注明一些 开发思路 BUG 管理等. //2.62 修复了一堆BUG 增加...

    mysql数据库my.cnf配置文件

    [client] port = 3306 socket=/home/mysql/data/mysql.sock ...# 如果临时文件会变得超过索引,不要使用快速排序索引方法来创建一个索引。注释:这个参数以字节的形式给出 myisam_repair_threads ...

    aep文件修改

    在Win7中,用帐户登录系统后在右下角出现这样一个提示信息:您已使用临时配置文件登录,并且桌面也没了,我不是需要知道解决办法,解决办法网上一搜一大堆,我想知道的是出现此类故障信息的原因是什么,什么情况使得...

    Authorware作业(课程设计)源文件及发布exe文件

    看到有些朋友的电脑开机后要好久才能动,一大堆程序自动运行,然后再把它们一一关掉。这样不是很烦吗?这里介绍两种方式禁止不必要的自动运行程序。这样做的好处除了能加快启动速度外,还能提高系统在运行中的稳定性...

    System Cleaner v7.6.23.680 官方正式版.zip

    硬盘会不够用,第一种情形就是安装了很多的软件,另一种情形就是放了一大堆没用的东西。前者必须要靠 Clean Swap 这样的专业反安装软件来处理;后者呢?放心交给 System Cleaner 吧! System Cleaner 提供了三种...

    System Cleaner v6.7.1

    硬盘会不够用,第一种情形就是安装了很多的软件,另一种情形就是放了一大堆没用的东西。前者必须要靠 Clean Swap 这样的专业反安装软件来处理;后者呢?放心交给 System Cleaner 吧! System Cleaner 98 提供了三种...

    你必须知道的495个C语言问题

    2.22 有没有一种自动方法来跟踪联合的哪个域在使用? 枚举 2.23 枚举和一组预处理的#define有什么不同? 2.24 枚举可移植吗? 2.25 有什么显示枚举值符号的容易方法吗? 位域 2.26 一些结构声明中的这些...

    《你必须知道的495个C语言问题》

    2.22 有没有一种自动方法来跟踪联合的哪个域在使用? 30 枚举 31 2.23 枚举和一组预处理的#define有什么不同? 31 2.24 枚举可移植吗? 31 2.25 有什么显示枚举值符号的容易方法吗? 31 位域 31 2.26 ...

    MAT 文件库:从 Java 读取和写入 MAT 文件-matlab开发

    MAT 文件库 (MFL) 是一个 Java 库,用于读取和写入与 MATLAB 的 MAT 文件格式兼容的 MAT 文件。 它的总体设计目标是: * 提供符合 MATLAB 语义行为的用户友好 API *支持在堆受限或分配受限的环境中处理大量数据* ...

    C语言FAQ 常见问题列表

    o 3.16 枚举和一组预处理的 #define 有什么不同? o 3.17 有什么容易的显示枚举值符号的方法? * 4. 表达式 o 4.1 为什么这样的代码: a[i] = i++; 不能工作? o 4.2 使用我的编译器,下面的代码 int i=7; ...

    微信公众号开发+H5页面语音录入+下载+amr转换为MP3+讯飞语音转文字

    通过微信提供得获取临时素材文件得接口,得到了文件(具体方法网上一搜一大堆,后期我也会将完整得代码放进资源里面),但是这里有一个坑得问题,他的格式为.amr得格式,但是最后的目的是转换为文字,因此这里涉及到...

    EmEditor Pro(文本编辑器) V15.9.0 绿色中文版

    各大编辑器都有一堆的语法高亮文件,然而却没有TXT文件的“语法高亮”。TXT文件也有语法?呵呵。polaris的自定义语法。这也是polaris找到EmEditor后欣喜若狂的原因之一。 新建一个TXT文件,执行“工具”→“当前...

    java8源码-Large-File-Small-Memory-Sorting:大文件小内存排序

    此时会有100000/5000=20个临时文件(外部排序) 排序后选出每个临时文件的前128条,保存,此时有128 * 20 = 2560 条,此时一定小于1MB,可以全局读入到内存排序,做内部排序 排序(归并排序算法) public void sort...

    m3u8 下载工具 m3u8 downloader 2.9.7.rar

    m3u8 downloader 是一款由 .Net 开发的一个简单易用的 m3u8 下载器,现在很多视频网站的视频都分割成了小片段,其 m3u8 就是来记录这一堆地址的文件,使用本下载器可以快速的下载并合并成一个完整的视频文件。

    AcmeCADConverter2014

    手上有一堆CAD图纸,临时需要打印,可是没装CAD怎么办,不怕,今天小编就给你分享一款Acme CAD Converter 2014 汉化版。Acme CAD Converter 2014 中文版是专业的CAD图形文件转换和查看软件,支持DWG DXF DWF ( Auto...

    你必须知道的495个C语言问题(PDF)

    2.16 枚举和一组预处理的#define 有什么不同? . . . . . . . . . . . . 10 2.17 有什么容易的显示枚举值符号的方法? . . . . . . . . . . . . . . . 11 3 表达式13 3.1 为什么这样的代码: a[i] = i++; 不能工作? ...

    DevOps-版本控制进阶

    “最具挑战性的事情是你最终要将一大堆功能集中到一个提交里,因为它们都是这个组件的一部分”,他解释说:“我希望有一个更好的方式来分解这些提交,因为很难把所有事情(变更历史)记在脑子里。”如果这个情况你听...

Global site tag (gtag.js) - Google Analytics