一、故障说明:
Linux系统中长时间运行程序后,出现java.nio.file.FileSystemException: xxx: Too many open files错误。显示打开的文件太多了。
二、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: 表示没有限制,用户可以锁定任意数量的内存