在我的 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/