java.nio.file.Files.newInputStream(myfile.toPath())比new FileInputStream(file)更好吗?

4
我正在使用Sonar检查我的Java代码时,发现有一个问题。它建议我们使用`java.nio.file.Files.newInputStream(myfile.toPath())`而不是使用`new FileInputStream(file)`。Sonar的描述如下:
这个方法会创建并使用`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());`
我的问题是,这个建议是否正确?

我会感到惊讶。在Javadoc中没有关于它不含finalizer的内容。 - user207421
1个回答

6
这是一个复杂的语句,因此将其分成更小的块可能是值得的。 首先,
该方法创建并使用java.io.FileInputStream或java.io.FileOutputStream对象。不幸的是,这两个类都实现了finalize方法。这是真的和假的。该函数本身从Java 9开始被标记为弃用。而且,它已经在5个月前被删除了。因此,取决于您使用的Java版本。它可能仍然存在(假设大多数人仍在使用Java 8)。有关更多信息,请参见commit
这意味着创建的对象可能会一直保留,直到进行完整的垃圾收集,这将在堆上留下过多的垃圾,并且可能比预期的时间长得多。
是的,因为finalize函数在GC之后被调用。那么,很可能对象会在堆上停留更长时间。请参阅finalize函数的javadoc here

Java 7引入了两种创建读写文件流的方式,不需要考虑这个问题。

没错,我已经查看了openjdk仓库中的源代码。而且,我没有看到这两个函数使用的类实现了finalize方法。请参见这里的仓库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接