【问题标题】:Sonar major alert for using FileOutputStream with CSVWriter将 FileOutputStream 与 CSVWriter 一起使用的声纳主要警报
【发布时间】:2019-11-20 08:43:21
【问题描述】:

在一个 Spring Boot 应用程序(Java 1.8)中,我们使用 CSWriter 将一些数据写入 CSV 文件。

我们还使用 Sonar 来控制代码异味和覆盖率。

我遇到了来自 Sonar 的有关此代码的主要警报之一的问题:

CSVWriter writer = new CSVWriter(new OutputStreamWriter(
                new FileOutputStream(directory + File.separator + csv, true), StandardCharsets.UTF_8))

Sonar 告诉我使用新方法从 Java 1.7 创建流:

此方法创建并使用 java.io.FileInputStream 或 java.io.FileOutputStream 对象。不幸的是,这两个类都实现了一个 finalize 方法,这意味着创建的对象可能会一直挂起,直到发生完整的垃圾回收,这将使过多的垃圾在堆上停留的时间更长,甚至可能比预期的长得多。 Java 7 引入了两种方法来创建用于读取和写入不存在此问题的文件的流。您应该考虑从上述这些类切换到 InputStream is = java.nio.file.Files.newInputStream(myfile.toPath()); OutputStream os = java.nio.file.Files.newOutputStream(myfile.toPath());

我不知道如何处理这个错误,因为 OutputStreamWriter 正在等待一个 OutputStream。你们中有人有同样的问题吗?我应该选择其他 CSV 管理器吗?

【问题讨论】:

  • 您是否考虑过完全按照异常消息中的说明进行操作?另外,您可以尝试Files.newBufferedWriter() 的其中一个或其他重载。这样,Sonar 就不会看到底层流。
  • @monthix - 你修好了吗?

标签: java spring-boot csv sonarqube


【解决方案1】:

如果你只是想摆脱 FileOutputStream 你可以使用类似的东西:

File file = new File("pathName");
OutputStream os = java.nio.file.Files.newOutputStream(file.toPath());
final CSVWriter csvWriter = new CSVWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));

我没有配置 Sonar,所以不确定现在是否可以。

另一方面,您可以在 try 子句之后使用 try-with-resources 关闭流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多