对于用Java 7编写的新应用程序,是否有理由再使用一个java.io.File
对象,或者我们可以认为它已被弃用?
我相信,一个人java.nio.file.Path
可以做的一切java.io.File
以及更多。
对于用Java 7编写的新应用程序,是否有理由再使用一个java.io.File
对象,或者我们可以认为它已被弃用?
我相信,一个人java.nio.file.Path
可以做的一切java.io.File
以及更多。
Answers:
长话短说:
java.io.File
极有可能永远不会被弃用/不受支持。也就是说,它java.nio.file.Path
是更现代的java.nio.file
lib的一部分,它java.io.File
可以做的所有事情,但是通常以更好的方式,甚至更多。
对于新项目,请使用Path
。
而且,如果您需要File
旧的对象,只需调用Path#toFile()
从文件迁移到路径
该Oracle页面突出显示了差异,并映射java.io.File functionality
到java.nio.file lib (including Path) functionality
Janice J. Heiss和Sharon Zakhour的文章,2009年5月,讨论了JDK 7中的NIO.2文件系统。
File
而不是Path
?
Path
可以更容易地修改为使用来“添加子项” resolve(...)
或使用来“上一级” getParent()
,等等,File
但是不能。本质上,一旦您完成了路径的修改,就经常会对其进行转换,toFile()
以便可以将其发送到遗留方法(例如FileInputStream
构造函数)中。
我们可以认为它已经过时了吗?
不,除非在Javadoc中如此标记,否则您不能认为它已被弃用File
。
java.io.File
仍然没有被删除甚至不推荐使用,并且Javadoc中仍然没有任何东西暗示这两种事情都会发生。
我将完成的非常好的回答@mmcrae
。
是否有任何理由再使用java.io.File对象,或者我们可以认为它已被弃用?
JDK类很少被弃用。
您可以在JDK 8 API不推荐使用列表中看到自第一个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可以完成的所有工作,甚至更多。
你有答案。
在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
type。
不推荐使用Java.io.File。是的,java.nio.file.Path更好,但是只要仍然有大量使用Java.io.File的程序和教科书,如果仅出于遗留原因,就不应认为它已被弃用,这太重要了。这样做只会在工作中投入一把扳手,而不会带来全部收益。例如,Android框架将File用于其一些基本的文件处理功能,而其他许多事情也是如此。
Path
更好。他问是否File
已弃用。
对于用Java 7编写的新应用程序,是否有理由再使用java.io.File对象,还是可以认为它已弃用?
这有点像说:“拿破仑应该入侵俄罗斯,还是这些布鲁塞尔芽菜真的很美味?”
至于问题的第二部分,您确实可以认为它已过时。截至2018年1月,它不被弃用。但是没有什么可以阻止您这么考虑的。这是否会为您带来今生或未来的任何优势,这是无法说的。
File
。我应该同意还是不同意?”
File
。它不会很快消失。
it isn't deprecated. But there's nothing to stop you *considering* it so
大声笑。