我应该在response.getOutputStream()上显式关闭ZipOutputStream吗?

时间:2017-09-25 08:23:27

标签: java servlets memory-leaks io resource-management

我读过以下主题: Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?

但是如果我使用以下结构怎么办?

    ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

我应该关闭它还是容器会代替我?

2 个答案:

答案 0 :(得分:1)

一般来说,关闭最外层的流会将close()传播到内部流,关闭所有必需的资源。

当然,完全可以创建一个表现不佳的流,但ZipOutputStream可能不是一个。

在某些情况下,在最外层的流上调用close()可能是不够的,但该类的文档应该表明任何特殊行为。

答案 1 :(得分:1)

是的,您应该在close()上明确地ZipOutputStream方法,here's close()方法的代码。它执行以下操作:

  • 调用超类的close(),在我们的案例中为DeflaterOutputStream
  • 在基础close()上致电DeflaterOutputStream之前,finish()close()来电OutputStream
  • finish()

close()方法会写入剩余的压缩数据,因此如果您未明确调用ZipOutputStream上的function add_and_keeper(){ let $and_keepers = $("#and_keepers"); // $and_keepers = [td#and_keepers] let $keeper_choice_clone = $person_choice.clone() // $keeper_choice_clone = [select#id_person_choice, prevObject: r.fn.init(1)] let $wrapped = $keeper_choice_clone.wrap("<div>"); // $wrapped = [select#id_person_choice, prevObject: r.fn.init(1)] let $new_elem = $and_keepers.append($wrapped).children("select:last-child"); } ,则最终可能会收到一些未写入的数据。所以,我建议打电话给它。