问题标签 [autocloseable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1417 浏览

java - Try-with-resources 关闭订单

我正在查看 Java 中的 try-with-resources 示例,我了解以下内容:

所以,关闭的顺序是:

这是完美的,因为一个连接有一个语句,一个语句有一个结果集。

但是,在以下示例中,我认为关闭的顺序与预期相反:

示例 1:

关闭顺序为:

示例 2:

关闭顺序为:

这些例子正确吗?我认为这些例子中的结束应该是不同的,因为:

  1. 在示例 1 中,BufferedReader 具有 FileReader。
  2. 在示例 2 中,ObjectOutputStream 具有 FileOutputStream。
0 投票
3 回答
2339 浏览

java - 什么是在 Java 中计时代码执行的干净方法?

它可以很方便地为代码执行计时,这样您就知道需要多长时间。但是,我发现这是草率完成的常见方式,因为它应该具有相同的缩进,这使得阅读实际计时的内容变得更加困难。

一次尝试

我想出了以下,它看起来好多了,有一些优点和缺点:

好处:

  • 由于缩进,很明显正在计时
  • 它会自动打印代码完成后需要多长时间

缺点:

  • 这不是AutoClosable应该使用的方式(很确定)
  • 它创建了一个TimeCode不好的新实例
  • 块内声明的变量在try块外不可访问

它可以这样使用:

使这成为可能的代码是:

问题

我的问题是:

  • 我的方法真的有我想的那么糟糕吗
  • 有没有更好的方法来计时 Java 中的代码执行,您可以清楚地看到正在计时的内容,或者我只需要满足于我的第一个代码块之类的东西。
0 投票
2 回答
562 浏览

java - Jersey:HTTP 响应后关闭 I/O 资源

我的设置:我创建了一个 REST 服务(Jersey/Dropwizard),它从数据库中流式传输大量内容。在 GET 操作期间,服务通过连接池接入数据库,将数据包装到流中并执行一些即时转换,以各种编码(CSV、JSON 等)呈现请求的数据。数据库连接的生命周期与流的生命周期相关,只有当流关闭时,数据库连接才会释放。

流转换由 Encoder 类执行,该类返回StreamingOutput,然后将其传递给 Response 对象。编码器当前在流被完全消耗时处理资源关闭。

我的问题:由于StreamingOutput没有实现AutoCloseable,当输出仅被部分消耗时,可能会发生连接泄漏。

我有时观察到过时的活动连接在连接池中堆积,我怀疑它们是由中止的 HTTP 连接引起的。如下所示,当前代码处理try块中发生的异常。我无法处理的是在 return 语句之后发生的异常,我不知道如何将关闭资源的任何指令附加到Response对象。

我的问题:如何通知Response对象在请求终止后关闭特定资源(定期或由于错误)?或者:当请求上下文结束时,是否有更好的方法可以安全地关闭任何相关资源?

0 投票
5 回答
6237 浏览

java - 在 Java 中,如何检查 AutoCloseable.close() 是否已被调用?

我正在创作一个 java 库。一些打算供图书馆用户使用的类拥有本地系统资源(通过 JNI)。我想确保用户“处置”这些对象,因为它们很重,并且在测试套件中它们可能会导致测试用例之间的泄漏(例如,我需要确保TearDown将处置)。为此,我让 Java 类实现了 AutoCloseable,但这似乎还不够,或者我没有正确使用它:

  1. 我看不到如何try-with-resources在测试上下文中使用语句(我正在使用JUnit5with Mockito),因为“资源”不是短暂的 - 它是测试夹具的一部分。

  2. 一如既往地勤奋,我尝试finalize()在那里实现和测试闭包,但结果finalize()甚至没有被称为(Java10)。这也被标记为已弃用,我相信这个想法会不受欢迎。

这是怎么做到的?需要明确的是,如果应用程序的测试(使用我的库)不调用close()我的对象,我希望它们失败。


编辑:如果有帮助,请添加一些代码。这并不多,但这是我正在尝试做的。


Edit2, 赏金结果谢谢大家的回复,一半的赏金是自动奖励的。我得出结论,对于我的情况,最好尝试涉及Cleaner. 然而看起来,清洁动作虽然已注册,但并未被调用。我在这里问了一个后续问题。

0 投票
0 回答
87 浏览

java - 为什么不调用 Cleaner 操作?

这是此问题的后续问题。

具体来说,我正在尝试验证 API 的正确使用,该 API 涉及close()通过 JNI 调用持有大量本机资源的 Java 对象。重申一下这个问题,在测试和生产中都需要这样做,因为资源从一个测试用例泄漏到另一个测试用例和生产中,因为本地资源应该以受控方式处理。

代码(我想要处理的所有此类 Java 对象都将扩展 JPeer):

为什么不调用清洁器操作?我在控制台中既没有看到“JPeer 已关闭”,也没有看到“JPeer 未关闭”。无法从更清洁的操作中打印某些内容是个问题吗?(我知道从那里抛出的异常会被忽略,所以AssertionError没用)如果是这样,我如何通知我的验证结果?

0 投票
1 回答
810 浏览

java - 如何正确地将 InputStream 传递给另一个构造函数?(爪哇)

在下面的代码中,我尝试访问采用 InputStream 的其他构造函数...但是我需要以某种方式关闭此流以避免资源泄漏。如果我尝试尝试捕获,它会抱怨构造函数调用不是第一个语句。有没有什么方法可以通过这个 InputStream 而没有任何潜在的风险?

0 投票
1 回答
772 浏览

java - 异常安全地返回 Autoclosable 对象

当你想使用某个AutoClosable对象时,你应该使用try-with-resources。行。但是,如果我想编写返回的方法AutoClosable怎么办?在您从某个地方创建或接收 AutoCloseable 对象后,您应该在出现异常时关闭它,如下所示:

如果你不写try/catch块,你会泄漏资源,该 autoCloseable 对象持有,以防出现异常// some work。但这try/catch还不够,因为autoCloseable.close()也可以抛出异常(按设计)。因此,上面的代码转换为

这是很多样板。有没有更好的方法在java中做到这一点?

0 投票
2 回答
594 浏览

java - Closeable 和 AutoCloseable close() 方法的执行顺序

有人可以向我解释这里发生了什么以及按什么顺序吗?输出对我来说没有任何意义。

输出为 T 1 IOE F。

代码是:

0 投票
2 回答
141 浏览

java - 是否有正确的方法来关闭在 java 流 api 中打开的资源(对于每个元素)?

有没有正确的方法为集合中的每个元素打开资源,而不是使用流 api,使用资源做一些 map()、filter()、peek() 等,然后关闭资源?

我有这样的事情:

这应该可以正常工作,除了我在 getElementFromName 方法中打开一个资源(例如数据库连接)。然后我在 someCondition 或 doSomething 等其他实例方法中使用该资源。而且我不知道如何正确关闭它。

我知道,我只在流上使用中间操作。这意味着,所有方法都在 forEach 操作中进行评估,并且性能应该没问题,因为迭代只进行一次。

但我不知道如何关闭为 getElementFromName 方法中的每个元素打开的资源。

我可以保存由 getElementFromName 创建的所有元素的列表并稍后关闭资源。但我只会浪费空间,让所有资源保持活力。也将通过元素列表进行第二次迭代。在这种情况下,这使得避免使用流 api 更可取。那么有没有办法在我使用完元素后以某种方式自动关闭资源?

我也知道,可以使用 foreach lopp 轻松完成,我只是好奇是否可以使用流 api 完成。

0 投票
3 回答
887 浏览

java - 在 try-with-resources 中关闭动态数量的 AutoCloseable 对象

我正在一个块中创建可变数量的AutoCloseable对象。try-with-resources在任何退出点,我都希望关闭所有分配的资源。

我可以想象自己写一些东西来做到这一点,但是是否有一个类似于Python 的 contextlib.ExitStack的现有实用程序可以关闭分配的资源?我希望它看起来像这样:

(注意:这不是这个问题,因为我不知道我会提前有多少资源。

嘿密切的选民我不是要一个库,我是在问你如何完成安全关闭动态数量AutoCloseables 的任务,如果有它的语言功能,很好,如果有标准库函数,也很好,如果我必须自己写,很好。如果您想推荐一个常用的第三方库,其中包含它,那么当然可以。