当前位置: 首页 > 知识库问答 >
问题:

文件系统。getDefault()。getPath()vs路径。get()和资源泄漏

慕宏儒
2023-03-14

如果我使用文件系统。getDefault()。getPath()它在文件系统中保存资源。getDefault()。很少有像sonar、coverity这样的工具会因为使用它而带来严重的资源泄漏问题。

如果我将其替换为路径。get()所有这些工具都会悄悄地接受这一点,并且不会出现错误或资源泄漏警告。

如果我们看到路径的实现。get(),它实际上是在做文件系统。getDefault()。getPath()

我在这里的问题是,java如何处理Paths.get()的资源泄漏,因为代码完全相同,但我们没有引用FileSystems.getDefault()来显式关闭它?

共有1个答案

慕承恩
2023-03-14

您的工具正在报告假阳性。这是因为FileS返回的声明类型ystems.getDefault()FileSystem,实现了Closeable。这意味着理想情况下你应该关闭它。然而,默认的文件系统是一个例外(它甚至抛出一个Unsupport tedoperathtml" target="_blank">ionExc0019)。你的工具无法区分。

这种情况比你想象的要频繁。我经常看到一些例子:

  • 对象的结果。requirennoull。输入按原样返回,但如果输入是可自动关闭的,我的IDE会将其视为新资源
  • 来自servlet请求的输入流或读取器,以及来自servlet响应的输出流或写入器

在某些情况下,工具和IDE可以是智能的。例如,如果我将变量声明为ByteArrayInputStreamByteArrayOutputStreamStringReaderStringWriter,那么我的IDE知道它们不需要关闭。然而,当我分别以InputStreamOutputStreamReaderWriter的方式从方法返回它们时,如果我不关闭它们,我的IDE就会开始抱怨。

如果您知道这是一个假阳性,您可以使用@SuppressWarnings(“资源”)来忽略一些工具发出的警告。通常可以应用于单个变量:

@SuppressWarnings("resource") FileSystem defaultFS = FileSystems.getDefault();
Path path = defaultFS.getPath("foo");

然而,即使这样,有时您的工具也会抱怨,您必须抑制整个方法的资源警告。如果是这样的话,试着让你的方法(因此警告抑制的范围)尽可能小;如果需要,将代码拆分为新方法。

 类似资料:
  • 在Spring中,我可以通过指定相对于目录的路径来访问资源。例如,如果我要求,我将得到一个表示。然而,我看不到相反的方向。 给定一个,是否有办法找到它相对于的路径? 我正在使用来获取我的应用程序中的文件资源列表。我需要的资源位于我的应用程序的文件夹中。 我可以很容易地得到绝对路径,但是我想找到一种方法来获得从开始的部分,因为Spring就是这样发现它的。

  • 本文将介绍 Weex 中 uri(url) 的用法。包括使用图像、字体等资源,处理相对路径以及如何访问本地及打包的资源文件。 Schemes 本地资源 Weex SDK 提供 local scheme 来访问打包在应用程序中的资源,此 scheme 无法在 H5 环境下使用。目前,开发者可以在 image 组件和字体文件中使用本地资源。 在 iOS 中,Weex 会在 bundle resourc

  • 问题内容: 我的项目设定 我有以下项目设置: 在我的代码中,我使用相对URL引用图像。 问题 如果我在目录中使用以下命令运行此程序: 然后一切正常,Java能够找到该图像。 现在,我的问题是,我需要能够从其他目录运行该程序。 该程序已执行,但是现在所有相对URL不再起作用。 我需要的 如何计算program.jar文件的执行位置,以便可以将相对URL更改为绝对URL? 问题答案: 如果可能的话,我

  • 4.7 应用上下文和资源路径 4.7.1 构造应用上下文 (某一特定)应用上下文的构造器通常可以使用字符串或字符串数组所指代的(多个)资源(如 xml 文件)来构造当前上下文。 当指定的位置路径没有带前缀时,那从指定位置路径创建的 Resource 类型(用于后续加载 bean 定义),取决于所使用应用上下文。举个列子,如下所创建的 ClassPathXmlApplicationContext :

  • 问题内容: 我的App Engine项目的war / WEB-INF文件夹中有一个文件。我在FAQ中读到,您可以在servlet上下文中从那里读取文件。我不知道如何形成资源的路径: 我将如何构造到该资源的路径以与File()一起使用,就像上面一样? 问题答案: 有两种方法可以做到这一点。只要扩展WAR文件(一组文件而不是一个.war文件),就可以使用以下API: http://tomcat.apa

  • 我也试着做 而我不断得到这个结果。