Java 文件上载终结点需要关闭InputStream吗?

Java 文件上载终结点需要关闭InputStream吗?,java,file-upload,jersey,jax-rs,multipartform-data,Java,File Upload,Jersey,Jax Rs,Multipartform Data,对于接受文件输入的API端点,我们需要手动关闭InputStream,还是框架为我们这样做 我已经查过了,但是找不到任何关于它的信息 寻找可靠的来源或某种验证方法。关闭InputStream是您的责任 Jersey无法知道何时关闭流。1)在您使用InputStream后,可以假定关闭它是安全的 2) 您还可以向Jersey ClosableService注册InputStream,根据其文档,它将为您关闭InputStream 我希望这有帮助 我只是想知道同样的事情,并在调试器中进行了尝试。泽西

对于接受文件输入的API端点,我们需要手动关闭
InputStream
,还是框架为我们这样做

我已经查过了,但是找不到任何关于它的信息


寻找可靠的来源或某种验证方法。

关闭InputStream是您的责任

Jersey无法知道何时关闭流。

1)在您使用InputStream后,可以假定关闭它是安全的

2) 您还可以向Jersey ClosableService注册InputStream,根据其文档,它将为您关闭InputStream


我希望这有帮助

我只是想知道同样的事情,并在调试器中进行了尝试。泽西河不会为你关闭河流

我认为最优雅的方法是使用try with resources,它可以接受自Java9以来的任意表达式,并为您调用
close()

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/upload")
public String upload(@FormDataParam("file") InputStream inputStream) {
    ...
    inputStream.close(); // necessary?
}

您应该始终关闭流,除非您有确凿的证据表明调用者想要这样做。如果您获得了流是的,这里您没有获得它,是吗?Jersey获取了该流,因此Jersey应该至少在http请求结束时关闭它。实现自定义MessageBodyReader时,显式声明“不要关闭MessageBodyReader实现中的实体输入流。该流将由运行时自动关闭。”
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/upload")
public String upload(@FormDataParam("file") InputStream inputStream) {
...
try (inputStream) {
   //...
} catch (IOException e) {
   //...
}