我正在使用soanr检查我的Java代码,一个问题表明,我们应该使用java.nio.file.Files.newInputStream(myfile.toPath())而不是新的FileInputStream(file)。声纳描述是:
此方法创建并使用java.io.FileInputStream或java.io.FileOutputStream对象。不幸的是,这两个类都实现了finalize方法,这意味着所创建的对象可能会一直徘徊,直到发生完整的垃圾回收为止,这将使堆上过多的垃圾保留的时间更长,甚至可能比预期的更长。 Java 7引入了两种创建流的方法,这些流不需要读写就可以读写文件。您应该考虑从上述这些类切换到InputStream = java.nio.file.Files.newInputStream(myfile.toPath()); OutputStream os = java.nio.file.Files.newOutputStream(myfile.toPath());
我的问题是,对吗?
答案 0 :(得分:0)
那是一个密集的陈述。因此,可能值得将其分成较小的块。 首先,
此方法创建并使用java.io.FileInputStream或java.io.FileOutputStream对象。不幸的是,这两个类都实现了finalize方法
这是对与错。自Java 9起,该函数本身已被标记为已弃用。而且,该函数已在5个月前删除。因此,取决于您使用的Java版本。它可能仍然存在(假设大多数人仍在使用Java 8)。有关更多信息,请参见此commit。
这意味着创建的对象可能会一直徘徊,直到发生完整的垃圾回收为止,这将使堆上过多的垃圾保留更长的时间,并且可能比预期的时间长得多。
是的,因为finalize
函数是在GC之后调用的。然后,对象很可能会在堆上停留更长的时间。有关finalize
函数here的信息,请参见javadoc。
Java 7引入了两种方法来创建用于读取和写入不涉及此文件的流的流
是的,我已经检查了openjdk存储库中的源代码。而且,我看不到这两个函数使用的类的实现实现了finalize
方法。查看仓库here