Java 7:路径与文件

问题描述 投票:183回答:7

对于用Java 7编写的新应用程序,是否有任何理由再使用java.io.File对象,或者我们可以考虑将其弃用吗?

我相信java.nio.file.Path可以做java.io.File可以做的一切以及更多。

java file-io path java-7 nio
7个回答
138
投票

长话短说:

java.io.File很可能永远不会被弃用/不受支持。也就是说,java.nio.file.Path是更现代的java.nio.file lib的一部分,并且java.io.File可以做的一切,但通常以更好的方式,甚至更多。

对于新项目,请使用Path

如果你需要一个File对象的遗产,只需要调用Path#toFile()

从文件迁移到路径

This Oracle page highlights differences, and maps java.io.File functionality to java.nio.file lib (including Path) functionality

Article by Janice J. Heiss and Sharon Zakhour, May 2009, discussing NIO.2 File System in JDK 7


17
投票

我们可以考虑弃用吗?

不,你不能认为它被弃用,除非并且直到它在File Javadoc中如此标记。


7
投票

查看这篇文章了解更多信息 - http://www.oracle.com/technetwork/articles/javase/nio-139333.html

基本上file.Path将是从现在开始的方式,但众所周知,Java人们倾向于保持背部兼容性,所以我猜这就是他们离开它的原因。


4
投票

是的,但是许多现有的API(包括Java7自己的标准API)仍然只能使用File类型。


3
投票

我将完成@mmcrae的非常好的答案。

是否有任何理由再使用java.io.File对象,或者我们可以考虑弃用它吗?

JDK类很少被弃用。 您可以在the JDK 8 API deprecates list上看到自第一个JDK以来已弃用的所有类。 它只包含Oracle文档和Java社区不鼓励使用的一小部分类。 java.util.Datejava.util.Vectorjava.util.Hashtable ......这些有很多缺陷的类都没有被弃用。 但为什么 ? 因为概念上某些deprecated意味着仍然存在,但不鼓励使用,因为它肯定会被删除。 成千上万的程序依赖于这些糟糕的设计类。 对于这样的类,Java API开发人员不会给出这样的信号。

@EJP的答案非常正确:

除非在Javadoc中如此标记,否则不会。

所以,我认为你的问题在其术语中更有意义: “由于我们有选择,我们应该使用java.io.Filejava.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);

1
投票

不推荐使用Java.io.File。是的java.nio.file.Path是更好的,但只要有大量的程序和教科书使用Java.io.File,如果仅出于遗留原因,它不应被视为已弃用,它太重要了。这样做只会在工作中投入一把扳手而不会获得任何好处。例如,Android框架使用File来实现一些基本的文件处理功能,还有许多其他功能。


-8
投票

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

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

至于问题的第二部分,你确实可以认为它已被弃用了。截至2018年1月,它没有被弃用。但没有什么可以阻止你考虑它。这是否会在今生或下一代中获得任何优势是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.