对于用 Java 7 编写的新应用程序,是否有理由再使用 java.io.File
对象,或者我们可以认为它已被弃用?
我相信 java.nio.file.Path
可以做所有 java.io.File
可以做的事情,甚至更多。
长话短说:
java.io.File
很可能永远被弃用/不受支持。也就是说,java.nio.file.Path
是更现代的 java.nio.file
库的一部分,并且可以完成 java.io.File
所能做的一切,但通常以更好的方式,甚至更多。
对于新项目,请使用 Path
。
如果您需要旧版 File
对象,只需调用 Path#toFile()
从文件迁移到路径
Article by Janice J. Heiss and Sharon Zakhour, May 2009, discussing NIO.2 File System in JDK 7
我们可以认为它已弃用吗?
不,您不能认为它已被弃用,除非并且直到它在 File
Javadoc 中如此标记。
java.io.File
仍然没有被删除甚至被弃用,Javadoc 中仍然没有任何内容表明这些事情中的任何一个都会发生。
查看这篇文章以了解更多信息 - http://www.oracle.com/technetwork/articles/javase/nio-139333.html
基本上 file.Path 将是从现在开始的方式,但众所周知,Java 人们倾向于保持向后兼容性,所以我想这就是他们离开它的原因。
我将完成@mmcrae
的非常好的答案。
是否有任何理由再使用 java.io.File 对象,或者我们可以认为它已被弃用?
JDK 类很少被弃用。
您可以在 the JDK 8 API deprecates list 上看到自第一个 JDK 以来弃用的所有类。
它只包含 Oracle 文档和 Java 社区不鼓励使用的一小部分类。< br> java.util.Date
、java.util.Vector
、java.util.Hashtable
...这些具有如此多缺陷的类不会被弃用。
但是为什么呢?
因为在概念上 deprecated
的含义仍然存在,但不鼓励使用,因为它肯定会被删除。
成千上万的程序依赖于这些设计不佳的类。
对于这些类,Java API 开发人员不会发出这样的信号。
@EJP
的答案非常正确:
除非它在 Javadoc 中如此标记,否则不会。
因此,我认为您的问题在其术语中会更有意义:
“既然我们可以选择,我们应该使用 java.io.File
还是 java.nio.file.Path
来进行新的开发,如果答案是 java.nio.file.Path
,您能否轻松将 java.io.File
用于使用 java.io.File
的旧项目?”
我相信 java.nio.file.Path 可以做 java.io.File 可以做的所有事情,甚至更多。
你有答案。
This oracle tutorial关于传统 IO 的内容证实了您的想法。
在 Java SE 7 发布之前,java.io.File 类是用于文件 I/O 的机制,但它有几个缺点。很多方法在失败时并没有抛出异常,所以不可能得到有用的错误信息。例如,如果文件删除失败,程序会收到“删除失败”,但不知道是因为文件不存在,用户没有权限,还是有其他问题。重命名方法在平台上的工作不一致。没有对符号链接的真正支持。需要对元数据提供更多支持,例如文件权限、文件所有者和其他安全属性。访问文件元数据效率低下。许多 File 方法没有扩展。通过服务器请求大型目录列表可能会导致挂起。大目录也可能导致内存资源问题,从而导致拒绝服务。如果存在循环符号链接,则不可能编写可以递归遍历文件树并适当响应的可靠代码。
由于 java.io.File
有这么多缺点,我们真的没有理由将这个类用于新的开发。
即使对于使用 java.io.File
的遗留代码,Oracle 也给出了使用 Path
的提示。
也许您有使用 java.io.File 的遗留代码,并希望利用 java.nio.file.Path 功能对您的代码影响最小。 java.io.File 类提供了 toPath 方法,它将旧样式的 File 实例转换为 java.nio.file.Path 实例,如下所示:
Path input = file.toPath();
然后,您可以利用 Path 类可用的丰富功能集。例如,假设您有一些删除文件的代码:
file.delete();
您可以修改此代码以使用 Files.delete 方法,如下所示:
Path fp = file.toPath();
Files.delete(fp);
是的,但是许多现有的 API,包括 Java7 自己的标准 API,仍然只适用于 File
类型。
Java.io.File 未被弃用。是的 java.nio.file.Path 更好,但只要还有很多程序和教科书使用 Java.io.File,如果只是出于遗留原因,它不应该被认为是弃用,它太重要了。这样做只是在工作中丢了一个扳手,而不会获得全部收益。例如,Android 框架将 File 用于其一些基本的文件处理功能,还有许多其他事情要做。
Path
是否更好。他询问 File
是否已被弃用。
众所周知,java.nio 包中的类使用 Path 实例,而不是 File 实例。如果尽可能使用 java.nio,建议使用 Path 类。
现在有时您将不得不使用 File 类。那是因为方法或构造函数想要将 File 实例作为参数,但是当您确实有选择时,请确保使用 File 上的 Path。
对于用 Java 7 编写的新应用程序,是否有任何理由再使用 java.io.File 对象,或者我们可以认为它已被弃用?
这有点像说:“拿破仑是应该入侵俄罗斯,还是这些球芽甘蓝真的很好吃?”
至于问题的第二部分,您确实可以认为它已弃用。截至 2018 年 1 月,它没有被弃用。但是没有什么可以阻止你这样考虑。这是否会在今生或来生为你带来任何好处是不可能的。
File
。我应该,是还是否?”
File
。它不会很快死去。
it isn't deprecated. But there's nothing to stop you *considering* it so
哈哈。
不定期副业成功案例分享
File
而不是Path
?Path
可以更容易地修改为使用resolve(...)
“添加子级”或使用getParent()
“上移一级”等,而File
不能。基本上,一旦您完成了路径的修改,您通常会将其转换为toFile()
,以便可以将其发送到旧方法中,例如FileInputStream
构造函数。