【发布时间】:2011-10-17 17:10:16
【问题描述】:
对于用 Java 7 编写的新应用程序,是否有理由再使用 java.io.File 对象,或者我们可以认为它已弃用?
我相信java.nio.file.Path 可以做任何java.io.File 可以做的事情,甚至更多。
【问题讨论】:
对于用 Java 7 编写的新应用程序,是否有理由再使用 java.io.File 对象,或者我们可以认为它已弃用?
我相信java.nio.file.Path 可以做任何java.io.File 可以做的事情,甚至更多。
【问题讨论】:
众所周知,java.nio 包中的类使用路径实例,而不是文件实例。如果尽可能使用 java.nio,建议使用 Path 类。
现在有时您将不得不使用 File 类。这是因为方法或构造函数想要将 File 实例作为参数,但是当您确实有选择时,请确保使用 Path 而不是 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 而不是 Path?
Path 可以更轻松地修改为使用resolve(...)“添加孩子”或使用getParent() 等“上移一级”,而File 不能。基本上,一旦您完成了 Path 的修改,您通常会将其转换为 toFile(),以便可以将其发送到旧方法中,例如 FileInputStream 构造函数。
Java.io.File 未被弃用。是的 java.nio.file.Path 更好,但只要还有很多程序和教科书使用 Java.io.File,如果只是出于遗留原因,它不应该被认为是弃用,它太重要了。这样做只是在工作中丢了一个扳手,而不会获得全部收益。例如,Android 框架将 File 用于其一些基本的文件处理功能,还有许多其他功能。
【讨论】:
Path是否更好。他询问File 是否已被弃用。
我们可以认为它已被弃用吗?
不,您不能认为它已被弃用,除非并且直到它在 File Javadoc 中如此标记。
【讨论】:
java.io.File 仍然没有被删除甚至被弃用,Javadoc 中仍然没有任何内容表明这些事情都会发生。跨度>
我会完成@mmcrae的非常好的回答。
还有什么理由再使用 java.io.File 对象吗? 认为它已弃用?
JDK 类很少被弃用。
您可以在 the JDK 8 API deprecates list 上看到自第一个 JDK 以来不推荐使用的所有类。
它只包含 Oracle 文档和 Java 社区不鼓励使用的一小部分类。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();
然后,您可以利用丰富的功能集 路径类。
例如,假设您有一些删除文件的代码:
file.delete();
您可以修改此代码以使用 Files.delete 方法,如下所示:
Path fp = file.toPath();
Files.delete(fp);
【讨论】:
对于用 Java 7 编写的新应用程序,是否有任何理由使用 java.io.File 对象是不是已经被弃用了?
这有点像说:“拿破仑应该入侵俄罗斯,还是这些球芽甘蓝真的好吃吗?”
至于问题的第二部分,您确实可以认为它已弃用。截至 2018 年 1 月,它没有被弃用。但是没有什么可以阻止您考虑。这是否会在今生或来世为你带来任何好处是不可能的。
【讨论】:
File。我应该,是还是不是?”
File。它不会很快死去。
it isn't deprecated. But there's nothing to stop you *considering* it so 哈哈。
查看这篇文章了解更多信息 - http://www.oracle.com/technetwork/articles/javase/nio-139333.html
基本上 file.Path 将是从现在开始的方式,但众所周知,Java 人们倾向于保持向后兼容性,所以我想这就是他们离开它的原因。
【讨论】:
是的,但是许多现有的 API,包括 Java7 自己的标准 API,仍然只能使用 File 类型。
【讨论】: