问题标签 [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 - 如何使用类之间的相互依赖关系替换 Java 11 项目中已弃用的 finalize() 方法
我有一个涉及多个类的 Java 11 项目。在当前场景中,我的 2 个类 - A 和 B - 实现了 java finalize() 方法,该方法现在已被永久弃用。我知道该方法在不久的将来可能不会被删除,但我认为最好立即找到一个替代方法来完成。
A 类中的 finalize() 主要专注于销毁作为受保护成员变量的 long 类型的对象,并将某些消息打印到日志中。B 类中的 finalize() 只是将某些消息打印到日志中。
A 类的实例是从其他几个类创建的,B 类扩展了另一个类 ClassLoader。(下面包含代码片段。)
我经历了很多建议,例如,
- 可使用 try-with-resources 自动关闭
- 可清洁的界面(https://humanoid-readable.claude-martin.ch/2014/07/30/finalize/)
- 试着抓住最后
这些首先解释得不是很好,即使它们解释得很好,这些示例也特定于单个类项目,其中 main 方法存在于同一类中。我无法继续使用我在网上找到的最小解决方案。
发表我的研究,Autocloseable with try-with-resources 似乎是我最好的选择。我知道我的 A 类和 B 类应该实现 Autocloseable,而被调用者(这里有点不确定)应该使用 try-with-resources。
我将感谢任何有助于简化此问题的帮助,即使它是为了填补我对场景的理解中可能存在的空白。
爪哇
B.java
java - 对于未实现 AutoCloseable 的类,使用 lambda 是一种安全、正确且等效的解决方法吗?
背景:我使用 Java 类InitialDirContext
来访问 LDAP 目录。 不幸的是,它没有实现 interface AutoCloseable
,因此不能在try-with-resources块中使用。
这是我写的原始代码:(受这个答案的启发)
这是一个安全、正确和等效的替代品吗?
我认为答案是肯定的,但我想确认一下。我尝试用谷歌搜索这种模式,但我什么也没找到。就是这么简单!因此,我怀疑它可能不正确。
编辑:我刚刚发现这个答案有类似的模式。
java - 我可以修改 ReentrantLock 以便可以通过资源尝试使用它吗?
我想问一下这个实现是否可以,或者可能有一些问题可能会在以后出现问题。
这个想法是实现一个可与“资源尝试”一起使用的 ReentrantLock 类,这意味着它必须实现 AutoCloseable 接口。
另外,我想问一下为什么在'main'方法中编译器产生我必须添加'catch'子句,因为我的close方法(在MyReentrantLock中)不会抛出异常。
这个实现好吗?(在构造函数中调用锁......)
如果我的关闭没有引发异常,为什么编译器会强制我添加一个 catch() 子句?
scala - 如何在 Scala 中编写资源,同时仍然使用 scala-arm 正确关闭它们?
我有一个类,它获取一个本地文件,对其进行转换并将其存储在 GCS 中:
我正在尝试删除一些代码重复,特别是创建fileInputStream
and gcsOutputStream
。但我不能简单地在方法顶部提取这些变量,因为它会在 scala-armmanaged
块之外创建资源:
如您所见,代码更清晰,更可测试,但资源没有被正确处理,因为它们不是“托管”的。例如,如果在创建时抛出异常gcsOutputStream
,fileInputStream
则不会关闭。
我可能可以使用Google Guava sources and sinks来解决这个问题,但我想知道在 Scala 中是否有更好的方法来解决这个问题,而无需引入 Guava。理想情况下使用标准库或 scala-arm 功能,甚至可能在Cats
?
- 我应该将
fileInputStream
and定义gcsOutputStream
为不带任何内容并返回流的函数吗?似乎代码在任何地方都会更加() => InputStream
冗长() => OutputStream
? - 我应该使用多个scala-arm“管理”来理解(一个定义
fileInputStream
andgcsOutputStream
,另一个在每个子函数内)?如果我这样做,“内部”输入流将被关闭两次不是问题吗? - 是否有一种我没有看到的干净和“scalaish”的方法来做到这一点?
java - 为什么 StandardOpenOption.DELETE_ON_CLOSE 没有删除 FileChannel 的源文件?
我们在 Java 中有一个底层方法,它应该在调用它的 close 方法时删除源文件。
现在我们对此进行功能集成测试,发现源文件没有被删除。
有人可以帮助我们吗?
java - java中封闭的资源应该如何表现?
我有一个 Java 类,它在内部拥有一个 Closeable 资源。这意味着我的类还实现了 Closeable 接口并在其自己的 close() 方法中关闭了内部资源。
我的类在关闭后的预期行为是什么,通常是 Java 中的任何已关闭对象?我看到该对象处于失效状态,其内部已关闭,但客户端仍对其有引用。IMO 访问它是一个编程错误,但错误会不时发生,所以即使在这种情况下,行为也应该是合理的......
我是不是该?
- 在所有方法调用上抛出异常,例如:IllegalState
- 闭上眼睛就像什么都没发生一样,让异常从关闭的资源中通过?
什么是规范的 Java 方式?
java - 如何为 java.util.logging.FileHandler 使用 try-with-resources?
我有以下代码并使用java.util.logging.FileHandler
.
在这种情况下,我应该手动关闭 finally 块中的资源。
此代码有效。现在,我认为它可以实现Autocloseable
接口。因此,我决定使用try-with-resources
forFileHandler
以便自动关闭资源(以消除关闭资源的手动工作)。
我尝试的代码如下:
但是这段代码不起作用。
它给出一个错误说:
The resource type FileHandler does not implement java.lang.AutoCloseable'
如果可能,如何使用 try-with-resources 自动关闭文件处理程序?
我需要手动关闭吗?或者我可以采取任何其他方法。
java - 创建 Flux.fromIterable 后如何运行 onClose 操作?
假设我们需要Flux
基于Closeable
资源的内容创建一个。为清楚起见,说有一个BufferedReader
要转换为Flux<String>
.
让我们假设iteratorOfLines
产生有限的项目集。
我正在寻找一种方法来关闭BufferedReader
当它Flux
消耗了所有数据或由于某种原因不需要剩余数据时(即订阅被中止)。
有一个构造函数reactor.core.publisher.FluxIterable(Iterable iterable, Runnable onClose)
,但是:
- 似乎无法从反应器的公共 API 访问(甚至是传递性的)
- 我怀疑它是否有帮助,因为它不包括 Flux 在获取可迭代的最后一项之前停止的情况。
Flux.fromIterable
发布最后一个项目后清理/关闭资源的正确方法是什么?
可能有比做fromIterable
类似事情更好的方法,所以欢迎所有选择。
java - 确保在 Cucumber 步骤定义中关闭 Autocloseable
我的 Cucumber Java 步骤定义可以创建AutoCloseable
对象,这些对象可以获得外部(可能是稀缺的)资源。这些对象应该在close()
不再需要它们时调用它们的方法,以释放这些资源。如何确保close()
调用这些方法?
在非 Cucumber 测试中,我会使用try-with-resources。但这是不可能的,因为没有跨越场景执行的单一方法(AutoCloseable
对象可能在when方法中创建,并在稍后的then中使用)。
java - 关闭资源是否应该始终由打开它的函数负责?
在上面的代码中,ResultSet 被打开executeQuery
但被关闭mapResultToRecord
。那是关闭它的理想场所还是应该由该findRecords
功能承担责任?