【发布时间】: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