问题标签 [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.
java - Try-with-resources 关闭订单
我正在查看 Java 中的 try-with-resources 示例,我了解以下内容:
所以,关闭的顺序是:
这是完美的,因为一个连接有一个语句,一个语句有一个结果集。
但是,在以下示例中,我认为关闭的顺序与预期相反:
示例 1:
关闭顺序为:
示例 2:
关闭顺序为:
这些例子正确吗?我认为这些例子中的结束应该是不同的,因为:
- 在示例 1 中,BufferedReader 具有 FileReader。
- 在示例 2 中,ObjectOutputStream 具有 FileOutputStream。
java - 什么是在 Java 中计时代码执行的干净方法?
它可以很方便地为代码执行计时,这样您就知道需要多长时间。但是,我发现这是草率完成的常见方式,因为它应该具有相同的缩进,这使得阅读实际计时的内容变得更加困难。
一次尝试
我想出了以下,它看起来好多了,有一些优点和缺点:
好处:
- 由于缩进,很明显正在计时
- 它会自动打印代码完成后需要多长时间
缺点:
- 这不是
AutoClosable
应该使用的方式(很确定) - 它创建了一个
TimeCode
不好的新实例 - 块内声明的变量在
try
块外不可访问
它可以这样使用:
使这成为可能的代码是:
问题
我的问题是:
- 我的方法真的有我想的那么糟糕吗
- 有没有更好的方法来计时 Java 中的代码执行,您可以清楚地看到正在计时的内容,或者我只需要满足于我的第一个代码块之类的东西。
java - Jersey:HTTP 响应后关闭 I/O 资源
我的设置:我创建了一个 REST 服务(Jersey/Dropwizard),它从数据库中流式传输大量内容。在 GET 操作期间,服务通过连接池接入数据库,将数据包装到流中并执行一些即时转换,以各种编码(CSV、JSON 等)呈现请求的数据。数据库连接的生命周期与流的生命周期相关,只有当流关闭时,数据库连接才会释放。
流转换由 Encoder 类执行,该类返回StreamingOutput,然后将其传递给 Response 对象。编码器当前在流被完全消耗时处理资源关闭。
我的问题:由于StreamingOutput没有实现AutoCloseable,当输出仅被部分消耗时,可能会发生连接泄漏。
我有时观察到过时的活动连接在连接池中堆积,我怀疑它们是由中止的 HTTP 连接引起的。如下所示,当前代码处理try块中发生的异常。我无法处理的是在 return 语句之后发生的异常,我不知道如何将关闭资源的任何指令附加到Response对象。
我的问题:如何通知Response对象在请求终止后关闭特定资源(定期或由于错误)?或者:当请求上下文结束时,是否有更好的方法可以安全地关闭任何相关资源?
java - 在 Java 中,如何检查 AutoCloseable.close() 是否已被调用?
我正在创作一个 java 库。一些打算供图书馆用户使用的类拥有本地系统资源(通过 JNI)。我想确保用户“处置”这些对象,因为它们很重,并且在测试套件中它们可能会导致测试用例之间的泄漏(例如,我需要确保TearDown
将处置)。为此,我让 Java 类实现了 AutoCloseable,但这似乎还不够,或者我没有正确使用它:
我看不到如何
try-with-resources
在测试上下文中使用语句(我正在使用JUnit5
withMockito
),因为“资源”不是短暂的 - 它是测试夹具的一部分。一如既往地勤奋,我尝试
finalize()
在那里实现和测试闭包,但结果finalize()
甚至没有被称为(Java10)。这也被标记为已弃用,我相信这个想法会不受欢迎。
这是怎么做到的?需要明确的是,如果应用程序的测试(使用我的库)不调用close()
我的对象,我希望它们失败。
编辑:如果有帮助,请添加一些代码。这并不多,但这是我正在尝试做的。
Edit2, 赏金结果谢谢大家的回复,一半的赏金是自动奖励的。我得出结论,对于我的情况,最好尝试涉及Cleaner
. 然而看起来,清洁动作虽然已注册,但并未被调用。我在这里问了一个后续问题。
java - 为什么不调用 Cleaner 操作?
这是此问题的后续问题。
具体来说,我正在尝试验证 API 的正确使用,该 API 涉及close()
通过 JNI 调用持有大量本机资源的 Java 对象。重申一下这个问题,在测试和生产中都需要这样做,因为资源从一个测试用例泄漏到另一个测试用例和生产中,因为本地资源应该以受控方式处理。
代码(我想要处理的所有此类 Java 对象都将扩展 JPeer):
为什么不调用清洁器操作?我在控制台中既没有看到“JPeer 已关闭”,也没有看到“JPeer 未关闭”。无法从更清洁的操作中打印某些内容是个问题吗?(我知道从那里抛出的异常会被忽略,所以AssertionError
没用)如果是这样,我如何通知我的验证结果?
java - 如何正确地将 InputStream 传递给另一个构造函数?(爪哇)
在下面的代码中,我尝试访问采用 InputStream 的其他构造函数...但是我需要以某种方式关闭此流以避免资源泄漏。如果我尝试尝试捕获,它会抱怨构造函数调用不是第一个语句。有没有什么方法可以通过这个 InputStream 而没有任何潜在的风险?
java - 异常安全地返回 Autoclosable 对象
当你想使用某个AutoClosable
对象时,你应该使用try-with-resources。行。但是,如果我想编写返回的方法AutoClosable
怎么办?在您从某个地方创建或接收 AutoCloseable 对象后,您应该在出现异常时关闭它,如下所示:
如果你不写try/catch
块,你会泄漏资源,该 autoCloseable 对象持有,以防出现异常// some work
。但这try/catch
还不够,因为autoCloseable.close()
也可以抛出异常(按设计)。因此,上面的代码转换为
这是很多样板。有没有更好的方法在java中做到这一点?
java - Closeable 和 AutoCloseable close() 方法的执行顺序
有人可以向我解释这里发生了什么以及按什么顺序吗?输出对我来说没有任何意义。
输出为 T 1 IOE F。
代码是:
java - 是否有正确的方法来关闭在 java 流 api 中打开的资源(对于每个元素)?
有没有正确的方法为集合中的每个元素打开资源,而不是使用流 api,使用资源做一些 map()、filter()、peek() 等,然后关闭资源?
我有这样的事情:
这应该可以正常工作,除了我在 getElementFromName 方法中打开一个资源(例如数据库连接)。然后我在 someCondition 或 doSomething 等其他实例方法中使用该资源。而且我不知道如何正确关闭它。
我知道,我只在流上使用中间操作。这意味着,所有方法都在 forEach 操作中进行评估,并且性能应该没问题,因为迭代只进行一次。
但我不知道如何关闭为 getElementFromName 方法中的每个元素打开的资源。
我可以保存由 getElementFromName 创建的所有元素的列表并稍后关闭资源。但我只会浪费空间,让所有资源保持活力。也将通过元素列表进行第二次迭代。在这种情况下,这使得避免使用流 api 更可取。那么有没有办法在我使用完元素后以某种方式自动关闭资源?
我也知道,可以使用 foreach lopp 轻松完成,我只是好奇是否可以使用流 api 完成。
java - 在 try-with-resources 中关闭动态数量的 AutoCloseable 对象
我正在一个块中创建可变数量的AutoCloseable
对象。try-with-resources
在任何退出点,我都希望关闭所有分配的资源。
我可以想象自己写一些东西来做到这一点,但是是否有一个类似于Python 的 contextlib.ExitStack的现有实用程序可以关闭分配的资源?我希望它看起来像这样:
(注意:这不是这个问题,因为我不知道我会提前有多少资源。
嘿密切的选民我不是要一个库,我是在问你如何完成安全关闭动态数量AutoCloseable
s 的任务,如果有它的语言功能,很好,如果有标准库函数,也很好,如果我必须自己写,很好。如果您想推荐一个常用的第三方库,其中包含它,那么当然可以。