与新的FileInputStream(file)相比,java.nio.file.Files.newInputStream(myfile.toPath())更好吗?

时间:2019-03-27 05:02:33

标签: java

我正在使用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());

我的问题是,对吗?

1 个答案:

答案 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