java.nio.file.FileSystemException: xxx: Too many open files

一、故障说明:

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: 表示没有限制,用户可以锁定任意数量的内存

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值