Java Try-with-resource 在 Map 中存储输入流

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

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

不想直接传这个MultipartFile直接反对该服务,所以我循环遍历每个 MultipartFile并创建一个简单的映射来存储文件名及其 InputStream .

像这样:

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

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

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

我将流存储在映射中的事实会导致内存泄漏吗?

最佳答案

流在执行到达 try 的右括号后立即关闭堵塞。
可以 Collection InputStream关闭后的任何地方。
但请注意,您 什么都看不懂 关闭此流后。

感谢评论

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

  • 如果您尝试从关闭的 FileInputStream 中读取你会得到java.io.IOException: Stream Closed
  • 如果您尝试从关闭的 ByteArrayInputStream 中读取没关系,因为它很特别close()实现:public void close() throws IOException {}
  • 关于Java Try-with-resource 在 Map 中存储输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38118660/

    相关文章:

    java - 结合RxJava了解Android内存泄漏

    java - 中断 BitmapFactory.decodeStream

    java - AWS ResetException - 无法重置请求输入流

    java - 如何强制对 super 方法进行多态调用?

    JAVA - 如何避免 MySQL 中的值重复?

    Java:递归和按值传递

    java - 图像不会出现在 JLabel 上。尝试了多种解决方案

    ios - 覆盖对象……这样可以吗?

    angular - 如何正确使用OnDestroy

    java.io.IOException : Attempted read on closed stream on aws s3 bucket