赞
踩
Linux系统中长时间运行程序后,出现java.nio.file.FileSystemException: xxx: Too many open files错误。显示打开的文件太多了。
这个异常通常表示你的程序打开了太多文件,超出了系统限制。这可能是因为你的程序在处理文件时未正确关闭文件流导致的
小编的问题是出在在上传图片处理的时候,处理完没有正确的释放流,所有长时间运行后,报错java.nio.file.FileSystemException: xxx: Too many open files
方式一、
以前
- for (MultipartFile file : files) {
- String fileName = file.getOriginalFilename();
- String contentType = file.getContentType();
- if(!FileTypeConstants.allowFileTypeList.contains(contentType)) continue;
- try {
- File dest = new File(filePath + subPath + File.separator + currentDate.getTime() + "_" + fileName);
- InputStream inputStream = file.getInputStream();
- if(contentType.startsWith("image")){
-
- // 。。。省略图片处理
- }else{
- file.transferTo(dest);
- }
- result.add(new HashMap<String,Object>(){{
- put("url","/" + FilePathConfig.getPrePath() +"/" + dest.getParentFile().getParentFile().getName() + "/" + dest.getParentFile().getName() + "/" + dest.getName());
- put("attType",contentType);
- put("name",fileName);
- if(StringUtils.isNotBlank(rowId))put("rowId",Integer.valueOf(rowId));
- }});
- } catch (Exception e) {
- e.printStackTrace();
- return R.failed("上传[" + fileName + "]文件失败");
- }
- }
现在
- for (MultipartFile file : files) {
- String fileName = file.getOriginalFilename();
- String contentType = file.getContentType();
- if(!FileTypeConstants.allowFileTypeList.contains(contentType)) continue;
- try {
- File dest = new File(filePath + subPath + File.separator + currentDate.getTime() + "_" + fileName);
- InputStream inputStream = file.getInputStream();
- if(contentType.startsWith("image")){
-
- // 。。。省略图片处理
- }else{
- file.transferTo(dest);
- }
- //关闭输入流
- inputStream.close();
-
- result.add(new HashMap<String,Object>(){{
- put("url","/" + FilePathConfig.getPrePath() +"/" + dest.getParentFile().getParentFile().getName() + "/" + dest.getParentFile().getName() + "/" + dest.getName());
- put("attType",contentType);
- put("name",fileName);
- if(StringUtils.isNotBlank(rowId))put("rowId",Integer.valueOf(rowId));
- }});
- } catch (Exception e) {
- e.printStackTrace();
- return R.failed("上传[" + fileName + "]文件失败");
- }
- }
方式二、进程在某个时刻打开了超过系统限制的文件数量,导致报错。
如果是Linux系统可以修改/etc/security/limits.conf文件
- * soft memlock unlimited
- * hard memlock unlimited
-
- *: 表示应用到所有的用户。
- soft: 表示软限制,即允许用户在达到限制之前设置自己的软限制。
- memlock: 表示锁定内存的大小,即控制用户可以锁定的内存量。
- unlimited: 表示没有限制,用户可以锁定任意数量的内存
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。