Joh*_*y19 2 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)
Run Code Online (Sandbox Code Playgroud)
我对Java流和流关闭的理解非常有限.我认为一旦代码到达try块的末尾try-with-resources
就会自动关闭InputStream
.
在上面的代码中什么时候完全multipartFile.getInputStream()
关闭?
我将流存储在地图中的事实会导致内存泄漏吗?
在执行到try
块的右括号后,流正好关闭.InputStream
关闭后可以存储在任何地方.但请注意,关闭它后,您无法从此流中读取任何内容.
感谢评论
此外,请注意某些流具有特殊行为,close()
并且始终取决于Stream
实现.例如:
FileInputStream
你会得到
java.io.IOException: Stream Closed
ByteArrayInputStream
它就没关系,因为它的特殊close()
实现:public void close() throws IOException {}
- 什么时候
multipartFile.getInputStream()
关闭?
try (InputStream is = multipartFile.getInputStream()) {
filesMap.put(file.getOriginalFilename(), is);
} // <-- here
Run Code Online (Sandbox Code Playgroud)
该
try-with-resources
语句确保在语句结束时关闭每个资源.
- 我将流存储在地图中的事实会导致内存泄漏吗?
不,你的收藏只是保持关闭InputStream
,你将无法从他们那里读取(此外,你会得到IOException
).
归档时间: |
|
查看次数: |
945 次 |
最近记录: |