【问题标题】:File upload endpoint need to close InputStream?文件上传端点需要关闭 InputStream?
【发布时间】:2018-11-13 07:57:46
【问题描述】:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/upload")
public String upload(@FormDataParam("file") InputStream inputStream) {
    ...
    inputStream.close(); // necessary?
}

对于接受文件输入的 API 端点,我们是否需要手动关闭 InputStream 还是由框架为我们完成?

我检查了Jersey docs,但找不到任何相关信息。

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

【问题讨论】:

  • 您应该始终关闭流,除非您有确凿的证据表明调用者想要这样做。
  • 如果你获得了流是,这里你没有获得它,泽西有

标签: java file-upload jersey jax-rs multipartform-data


【解决方案1】:

我只是想知道同样的事情并在调试器中进行了尝试。 Jersey 不会为你关闭直播。

我认为最优雅的方式是使用 try-with-resources,它可以采用 Java 9 以来的任意表达式并为您调用 close()

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/upload")
public String upload(@FormDataParam("file") InputStream inputStream) {
...
try (inputStream) {
   //...
} catch (IOException e) {
   //...
}

【讨论】:

    【解决方案2】:

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

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您有责任关闭 InputStream。

      Jersey 本质上不知道何时关闭您的信息流。

      【讨论】:

      • 是吗? Jersey 获得了流,因此 jersey 应该关闭它,至少在 http 请求结束时。在实现自定义 MessageBodyReader 时,documentation 明确指出“不要在 MessageBodyReader 实现中关闭实体输入流。该流将由 Jersey 运行时自动关闭。”
      猜你喜欢
      • 1970-01-01
      • 2012-03-21
      • 2011-08-01
      • 2011-08-12
      • 2021-02-10
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多