Java:路径与文件


Answers:


152

长话短说:

java.io.File极有可能永远不会被弃用/不受支持。也就是说,它java.nio.file.Path是更现代的java.nio.filelib的一部分,它java.io.File可以做的所有事情,但是通常以更好的方式,甚至更多。

对于新项目,请使用Path

而且,如果您需要File旧的对象,只需调用Path#toFile()

从文件迁移到路径

该Oracle页面突出显示了差异,并映射java.io.File functionalityjava.nio.file lib (including Path) functionality

Janice J. Heiss和Sharon Zakhour的文章,2009年5月,讨论了JDK 7中的NIO.2文件系统。


12
您可以在此处阅读Oracle关于差异的评论:docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder,

4
另请注意,“ Files”(复数形式)并未被弃用。它本质上是一个对Path对象进行操作并执行旧File类的许多功能的抽象类,例如isDirectory()或exist()
Josiah Yoder 2015年

2
现在我想知道:为什么JavaFX 8中的新File / FolderChooser对话框仍然使用File而不是Path
piegames's

2
路径是一个接口。要创建实例,请使用Paths.get(filename)。可能是由于不得不编写Files.exists(Paths.get(filename))而不是新File(filename).exists()造成的困惑,因此仍在使用较旧的API。
Josiah Yoder

Path可以更容易地修改为使用来“添加子项” resolve(...)或使用来“上一级” getParent(),等等,File但是不能。本质上,一旦您完成了路径的修改,就经常会对其进行转换,toFile()以便可以将其发送到遗留方法(例如FileInputStream构造函数)中。
MasterHD

18

我们可以认为它已经过时了吗?

不,除非在Javadoc中如此标记,否则您不能认为它已被弃用File


14
即使这是“因为RFC这么说”之一-答案,我也不认为这是一个好答案。很明显,File将被Path替换。如果您想提前,可以立即开始使用Path并在需要的地方使用toFile()。
克里斯(Chris)

15
@Chris Nothing从未从JDK中删除,因为他们在1.02中更改了AWT事件模型。这根本不是“显而易见的”。这是不对的。
罗恩侯爵

5
@downvoters这个答案本质上是重言式。不会错 注意:自从我写了这个答案以来的五年中,Java 8随后出现了,并且java.io.File仍然没有被删除甚至不推荐使用,并且Javadoc中仍然没有任何东西暗示这两种事情都会发生。
洛恩侯爵,

2
@EJP我刚刚赞成你的评论。但是,当您说答案是重言式时,我不能完全确定您是对的。这个问题可能应该以“基于观点的观点”来解决,是“我们是否可以认为它已弃用”。好吧,是的,OP和其他任何人都可以,但事实并非如此。
mike啮齿动物

@mikerodent我建议这只是故意误解问题的实质。也是部分报价。
罗恩侯爵

8

查看有关更多信息的本文-http: //www.oracle.com/technetwork/articles/javase/nio-139333.html

从根本上来说,file.Path将会是现在的方式,但是众所周知,Java人倾向于保持向后兼容,所以我想这就是为什么要保留它。


您能否更新链接?我想读这篇文章。
John B

不幸的是,我在oracle网页上找不到原始文章。这是
Wayback

1
我在普通的Oracle方面再次找到了这篇文章-添加了答案链接。
邓肯·琼斯

5

我将完成的非常好的回答@mmcrae

是否有任何理由再使用java.io.File对象,或者我们可以认为它已被弃用?

JDK类很少被弃用。
您可以在JDK 8 API不推荐使用列表中看到自第一个JDK以来不推荐使用的所有类。
它仅包含Oracle文档和Java社区不鼓励使用的类的一小部分。
java.util.Datejava.util.Vectorjava.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的Oracle教程证实了您的想法。

在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);

简而言之,她/他确实可以认为已弃用。
麦克啮齿动物,

@麦克啮齿动物。究竟。从概念上说,出于解释的原因,就Javadoc而言,她(她)应该不是这样。
davidxxx '18


1

不推荐使用Java.io.File。是的,java.nio.file.Path更好,但是只要仍然有大量使用Java.io.File的程序和教科书,如果仅出于遗留原因,就不应认为它已被弃用,这太重要了。这样做只会在工作中投入一把扳手,而不会带来全部收益。例如,Android框架将File用于其一些基本的文件处理功能,而其他许多事情也是如此。


他没有问是否Path更好。他问是否File已弃用。
罗恩侯爵,

1
@EJP我认为您在学究上有点过头了。OP确实询问过是否要弃用java.io.File,我回答了。.他还说:“我相信java.nio.file.Path可以完成java.io.File可以做的所有工作,甚至更多。” 我只是在确认他的评论,几乎不值得一票。
Andrew S

-9

对于用Java 7编写的新应用程序,是否有理由再使用java.io.File对象,还是可以认为它已弃用?

这有点像说:“拿破仑应该入侵俄罗斯,还是这些布鲁塞尔芽菜真的很美味?”

至于问题的第二部分,您确实可以认为它已过时。截至2018年1月,它不被弃用。但是没有什么可以阻止您这么考虑的。这是否会为您带来今生或未来的任何优势,这是无法说的。


5
我不理解你的比喻。
Tunaki

任何“或”问题都应提供两个逻辑选择,这两个选择实质上都回答了同一问题。
麦克啮齿动物

抱歉,在这种情况下,这听起来很古怪。这个想法是“我想使用File。我应该同意还是不同意?”
Tunaki

1
是的,我同意这是一个非常棘手的问题……尤其是因为仍然有大量现有的第三方API仍在使用File。它不会很快消失。
Tunaki

3
it isn't deprecated. But there's nothing to stop you *considering* it so大声笑。
唐·奇德尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.