java.io.File 与 java.nio.Files 哪个是新代码中的首选?

Posted

技术标签:

【中文标题】java.io.File 与 java.nio.Files 哪个是新代码中的首选?【英文标题】:java.io.File vs java.nio.Files which is the preferred in new code? 【发布时间】:2015-11-15 14:15:36 【问题描述】:

在围绕 SO 编写答案时,一位用户试图指出 java.io.File 不应在新代码中使用,相反他认为应该使用 new 对象 java.nio.Files;他链接到this article。

现在我已经用Java开发了好几年了,以前没有听说过这种说法;自从阅读了他的帖子以来,我一直在搜索,并没有找到很多其他来源可以证实这一点,而且就个人而言,我觉得文章中争论的许多观点都很薄弱,如果你知道如何阅读它们,错误引发的错误File 类通常会准确地告诉您问题所在。

随着我不断开发新代码,我的问题是:

这是 Java 社区中的一个活跃论点吗?对于新代码,Files 是否优于 File?两者之间的主要优点/缺点是什么?

【问题讨论】:

一个很好的理由是利用流进行文件操作,例如:将文件列表作为流而不是数组列表读取 在 NIO 的情况下,内存映射缓冲区允许直接从文件系统映射文件(无需加载到内存中)。可以在不耗尽堆空间的情况下处理非常大的文件。 【参考方案1】:

我会说两者都不是“首选”。相反,我建议您查看应用程序所需的功能,并使用java.io.Filejava.nio.Files 中的哪一个更符合要求。

答案很可能是平局,或者java.nio.Files 更好。但由您或您的团队决定,而不是 SO 上的其他程序员


这是 Java 社区中的一个活跃论点吗?

有些人会为任何事情争论。但我想说,社区(总体而言)有更重要的担忧。

【讨论】:

【参考方案2】:

File 有一个更新的实现:Path。与建设者Paths.get("...")。而且Files 也有许多不错的实用功能和更好的实现(move 而不是有时会失败的File.renameTo)。

Path 维护其文件系统。因此,您可以从 zip 文件系统(“jar:file:..... .zip”)中复制一些路径到另一个文件系统,反之亦然。

File.toPath() 可能有助于增量过渡。

Files 中的公用事业公司就可以转向盈利的新课程。

【讨论】:

【参考方案3】:

您链接的documentation 给出了答案:

java.nio.file 包定义了 Java 的接口和类 访问文件、文件属性和文件系统的虚拟机。 此 API 可用于克服 java.io.File 类。 toPath 方法可用于获取 Path 使用由 File 对象表示的抽象路径来定位 文件。生成的 Path 可以与 Files 类一起使用以提供 更有效和更广泛地访问其他文件操作, 文件属性和 I/O 异常,以帮助诊断错误时 对文件的操作失败。

【讨论】:

以上是关于java.io.File 与 java.nio.Files 哪个是新代码中的首选?的主要内容,如果未能解决你的问题,请参考以下文章

java.io.File 与 java.nio.Files 哪个是新代码中的首选?

java.io.File中的pathSeparator与separator的差异

Java基础——IO流

java.IO.File中与系统相关的静态字段如:“/”

Java文件类File详解

java IO