Java Try-with-resource在Map

时间:2016-06-30 09:11:44

标签: java memory-leaks inputstream try-with-resources

在我的API(Spring启动)中,我有一个端点,用户可以一次上传多个文件。端点将MultipartFile列表作为输入。

我希望不直接将此MultipartFile对象直接传递给服务,因此我遍历每个MultipartFile并创建一个存储文件名及其InputStream的简单地图。

像这样:

for (MultipartFile file : files) {       
      try (InputStream is = multipartFile.getInputStream()) {
        filesMap.put(file.getOriginalFilename(), is);
      }
    }
service.uploadFiles(filesMap)

我对Java流和流关闭的理解非常有限。 我认为一旦代码到达try块的末尾,try-with-resources会自动关闭InputStream

在上面的代码中,multipartFile.getInputStream()何时关闭?

我将流存储在地图中会导致内存泄漏吗?

2 个答案:

答案 0 :(得分:6)

Stream在执行到try块的右括号后立即关闭。 关闭它后,可以将InputStream存储在任何地方。 但请注意,关闭后,无法从此流中读取任何内容

感谢评论

另外,请注意某些流在close()上有特殊行为,并且始终取决于Stream实现。 例如:

  • 如果您尝试阅读已关闭的FileInputStream,您将获得 java.io.IOException: Stream Closed
  • 如果您尝试阅读已关闭的ByteArrayInputStream,那就可以了,因为它是特殊的close()实现:public void close() throws IOException {}

答案 1 :(得分:5)

  
      
  1. multipartFile.getInputStream()什么时候关闭?
  2.   
try (InputStream is = multipartFile.getInputStream()) {
     filesMap.put(file.getOriginalFilename(), is);
} // <-- here
  

try-with-resources语句确保在语句末尾关闭每个资源

  
      
  1. 我将流存储在地图中的事实会导致内存泄漏吗?
  2.   

不,您的收藏只是关闭InputStream,您将无法从中读取(此外,您将获得IOException)。