在我的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()
何时关闭?
我将流存储在地图中会导致内存泄漏吗?
答案 0 :(得分:6)
Stream在执行到try
块的右括号后立即关闭。
关闭它后,可以将InputStream
存储在任何地方。
但请注意,关闭后,无法从此流中读取任何内容。
感谢评论
另外,请注意某些流在close()
上有特殊行为,并且始终取决于Stream
实现。
例如:
FileInputStream
,您将获得
java.io.IOException: Stream Closed
ByteArrayInputStream
,那就可以了,因为它是特殊的close()
实现:public void close() throws IOException {}
答案 1 :(得分:5)
- 醇>
multipartFile.getInputStream()
什么时候关闭?
try (InputStream is = multipartFile.getInputStream()) {
filesMap.put(file.getOriginalFilename(), is);
} // <-- here
try-with-resources
语句确保在语句末尾关闭每个资源。
- 我将流存储在地图中的事实会导致内存泄漏吗?
醇>
不,您的收藏只是关闭InputStream
,您将无法从中读取(此外,您将获得IOException
)。