问题标签 [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 投票
1 回答
635 浏览

java - 如何使用类之间的相互依赖关系替换 Java 11 项目中已弃用的 finalize() 方法

我有一个涉及多个类的 Java 11 项目。在当前场景中,我的 2 个类 - A 和 B - 实现了 java finalize() 方法,该方法现在已被永久弃用。我知道该方法在不久的将来可能不会被删除,但我认为最好立即找到一个替代方法来完成。

A 类中的 finalize() 主要专注于销毁作为受保护成员变量的 long 类型的对象,并将某些消息打印到日志中。B 类中的 finalize() 只是将某些消息打印到日志中。

A 类的实例是从其他几个类创建的,B 类扩展了另一个类 ClassLoader。(下面包含代码片段。)

我经历了很多建议,例如,

这些首先解释得不是很好,即使它们解释得很好,这些示例也特定于单个类项目,其中 main 方法存在于同一类中。我无法继续使用我在网上找到的最小解决方案。

发表我的研究,Autocloseable with try-with-resources 似乎是我最好的选择。我知道我的 A 类和 B 类应该实现 Autocloseable,而被调用者(这里有点不确定)应该使用 try-with-resources。

我将感谢任何有助于简化此问题的帮助,即使它是为了填补我对场景的理解中可能存在的空白。

爪哇

B.java

0 投票
1 回答
281 浏览

java - 对于未实现 AutoCloseable 的类,使用 lambda 是一种安全、正确且等效的解决方法吗?

背景:我使用 Java 类InitialDirContext来访问 LDAP 目录。 不幸的是,它没有实现 interface AutoCloseable,因此不能在try-with-resources块中使用。

这是我写的原始代码:(受这个答案的启发

这是一个安全、正确和等效的替代品吗?

认为答案是肯定的,但我想确认一下。我尝试用谷歌搜索这种模式,但我什么也没找到。就是这么简单!因此,我怀疑它可能不正确。

编辑:我刚刚发现这个答案有类似的模式。

0 投票
1 回答
128 浏览

java - 我可以修改 ReentrantLock 以便可以通过资源尝试使用它吗?

我想问一下这个实现是否可以,或者可能有一些问题可能会在以后出现问题。

这个想法是实现一个可与“资源尝试”一起使用的 ReentrantLock 类,这意味着它必须实现 AutoCloseable 接口。

另外,我想问一下为什么在'main'方法中编译器产生我必须添加'catch'子句,因为我的close方法(在MyReentrantLock中)不会抛出异常。

  1. 这个实现好吗?(在构造函数中调用锁......)

  2. 如果我的关闭没有引发异常,为什么编译器会强制我添加一个 catch() 子句?

0 投票
1 回答
168 浏览

scala - 如何在 Scala 中编写资源,同时仍然使用 scala-arm 正确关闭它们?

我有一个类,它获取一个本地文件,对其进行转换并将其存储在 GCS 中:

我正在尝试删除一些代码重复,特别是创建fileInputStreamand gcsOutputStream。但我不能简单地在方法顶部提取这些变量,因为它会在 scala-armmanaged块之外创建资源:

如您所见,代码更清晰,更可测试,但资源没有被正确处理,因为它们不是“托管”的。例如,如果在创建时抛出异常gcsOutputStreamfileInputStream则不会关闭。

我可能可以使用Google Guava sources and sinks来解决这个问题,但我想知道在 Scala 中是否有更好的方法来解决这个问题,而无需引入 Guava。理想情况下使用标准库或 scala-arm 功能,甚至可能在Cats?

  • 我应该将fileInputStreamand定义gcsOutputStream为不带任何内容并返回流的函数吗?似乎代码在任何地方都会更加() => InputStream冗长() => OutputStream
  • 我应该使用多个scala-arm“管理”来理解(一个定义fileInputStreamand gcsOutputStream,另一个在每个子函数内)?如果我这样做,“内部”输入流将被关闭两次不是问题吗?
  • 是否有一种我没有看到的干净和“scalaish”的方法来做到这一点?
0 投票
2 回答
176 浏览

java - 为什么 StandardOpenOption.DELETE_ON_CLOSE 没有删除 FileChannel 的源文件?

我们在 Java 中有一个底层方法,它应该在调用它的 close 方法时删除源文件。

现在我们对此进行功能集成测试,发现源文件没有被删除。

有人可以帮助我们吗?

0 投票
3 回答
349 浏览

java - java中封闭的资源应该如何表现?

我有一个 Java 类,它在内部拥有一个 Closeable 资源。这意味着我的类还实现了 Closeable 接口并在其自己的 close() 方法中关闭了内部资源。

我的类在关闭的预期行为是什么,通常是 Java 中的任何已关闭对象?我看到该对象处于失效状态,其内部已关闭,但客户端仍对其有引用。IMO 访问它是一个编程错误,但错误会不时发生,所以即使在这种情况下,行为也应该是合理的......

我是不是该?

  • 在所有方法调用上抛出异常,例如:IllegalState
  • 闭上眼睛就像什么都没发生一样,让异常从关闭的资源中通过?

什么是规范的 Java 方式?

0 投票
1 回答
316 浏览

java - 如何为 java.util.logging.FileHandler 使用 try-with-resources?

我有以下代码并使用java.util.logging.FileHandler.

在这种情况下,我应该手动关闭 finally 块中的资源。

此代码有效。现在,我认为它可以实现Autocloseable接口。因此,我决定使用try-with-resourcesforFileHandler以便自动关闭资源(以消除关闭资源的手动工作)。

我尝试的代码如下:

但是这段代码不起作用。

它给出一个错误说:

The resource type FileHandler does not implement java.lang.AutoCloseable'

  • 如果可能,如何使用 try-with-resources 自动关闭文件处理程序?

  • 我需要手动关闭吗?或者我可以采取任何其他方法。

0 投票
1 回答
362 浏览

java - 创建 Flux.fromIterable 后如何运行 onClose 操作?

假设我们需要Flux基于Closeable资源的内容创建一个。为清楚起见,说有一个BufferedReader要转换为Flux<String>.

让我们假设iteratorOfLines产生有限的项目集。

我正在寻找一种方法来关闭BufferedReader当它Flux消耗了所有数据或由于某种原因不需要剩余数据时(即订阅被中止)。

有一个构造函数reactor.core.publisher.FluxIterable(Iterable iterable, Runnable onClose),但是:

  1. 似乎无法从反应器的公共 API 访问(甚至是传递性的)
  2. 我怀疑它是否有帮助,因为它不包括 Flux 在获取可迭代的最后一项之前停止的情况。

Flux.fromIterable发布最后一个项目后清理/关闭资源的正确方法是什么?

可能有比做fromIterable类似事情更好的方法,所以欢迎所有选择。

0 投票
1 回答
32 浏览

java - 确保在 Cucumber 步骤定义中关闭 Autocloseable

我的 Cucumber Java 步骤定义可以创建AutoCloseable对象,这些对象可以获得外部(可能是稀缺的)资源。这些对象应该在close()不再需要它们时调用它们的方法,以释放这些资源。如何确保close()调用这些方法?

在非 Cucumber 测试中,我会使用try-with-resources。但这是不可能的,因为没有跨越场景执行的单一方法(AutoCloseable对象可能在when方法中创建,并在稍后的then中使用)。

0 投票
2 回答
171 浏览

java - 关闭资源是否应该始终由打开它的函数负责?

在上面的代码中,ResultSet 被打开executeQuery但被关闭mapResultToRecord。那是关闭它的理想场所还是应该由该findRecords功能承担责任?