对于用Java 7编写的新应用程序,是否有任何理由再使用java.io.File
对象,或者我们可以考虑将其弃用吗?
我相信java.nio.file.Path
可以做java.io.File
可以做的一切以及更多。
长话短说:
java.io.File
很可能永远不会被弃用/不受支持。也就是说,java.nio.file.Path
是更现代的java.nio.file
lib的一部分,并且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中如此标记。
查看这篇文章了解更多信息 - http://www.oracle.com/technetwork/articles/javase/nio-139333.html
基本上file.Path将是从现在开始的方式,但众所周知,Java人们倾向于保持背部兼容性,所以我猜这就是他们离开它的原因。
是的,但是许多现有的API(包括Java7自己的标准API)仍然只能使用File
类型。
我将完成@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可以做的所有事情。
你有答案。
关于遗留IO的This oracle tutorial证实了你的想法。
在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);
不推荐使用Java.io.File。是的java.nio.file.Path是更好的,但只要有大量的程序和教科书使用Java.io.File,如果仅出于遗留原因,它不应被视为已弃用,它太重要了。这样做只会在工作中投入一把扳手而不会获得任何好处。例如,Android框架使用File来实现一些基本的文件处理功能,还有许多其他功能。
对于用Java 7编写的新应用程序,是否有任何理由再使用java.io.File对象,或者我们是否可以认为它已被弃用?
这有点像说:“拿破仑应该入侵俄罗斯,还是这些布鲁塞尔豆芽真的好吃?”
至于问题的第二部分,你确实可以认为它已被弃用了。截至2018年1月,它没有被弃用。但没有什么可以阻止你考虑它。这是否会在今生或下一代中获得任何优势是不可能的。