ChatGPT解决这个技术问题 Extra ChatGPT

Java:路径与文件

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

我相信 java.nio.file.Path 可以做所有 java.io.File 可以做的事情,甚至更多。


D
Don Cheadle

长话短说:

java.io.File 很可能永远被弃用/不受支持。也就是说,java.nio.file.Path 是更现代的 java.nio.file 库的一部分,并且可以完成 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


您可以在此处阅读 Oracle 对差异的评论:docs.oracle.com/javase/tutorial/essential/io/legacy.html
另请注意,不推荐使用“文件”(复数形式)。它本质上是一个抽象类,对 Path 对象进行操作并执行旧 File 类的许多功能,例如 isDirectory() 或 exists()
现在我想知道:为什么 JavaFX 8 中的新 File/FolderChooser 对话框仍然使用 File 而不是 Path
路径是一个接口。要创建实例,请使用 Paths.get(filename)。这可能是因为必须编写 Files.exists(Paths.get(filename)) 而不是 new File(filename).exists() 仍然使用旧 API。
Path 可以更容易地修改为使用 resolve(...)“添加子级”或使用 getParent()“上移一级”等,而 File 不能。基本上,一旦您完成了路径的修改,您通常会将其转换为 toFile(),以便可以将其发送到旧方法中,例如 FileInputStream 构造函数。
u
user207421

我们可以认为它已弃用吗?

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


即使这是“因为 RFC 这么说”的答案之一,我也不认为这是一个好的答案。很明显 File 将被 Path 替换。如果您想提前,您可以立即开始使用 Path 并在需要时使用 toFile() 。
@Chris 自从他们在 1.02 中更改 AWT 事件模型以来,没有从 JDK 中删除任何内容。这根本不是“显而易见的”。这是错的。
@downvoters这个答案本质上是重言式。这不可能是错的。注意在我写这个答案的五年里,Java 8 随后出现了,java.io.File 仍然没有被删除甚至被弃用,Javadoc 中仍然没有任何内容表明这些事情中的任何一个都会发生。
@EJP 我刚刚赞成你的评论。但是,当您说答案是重言式时,我并不完全确定您是对的。这个问题可能应该因为“基于意见”而被压制,是“我们可以认为它已被弃用”。好吧,是的,OP 和其他任何人都可以,但事实并非如此。
@mikerodent 我认为这只是对问题的真正含义的故意误读。也是部分引用。
D
Duncan Jones

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

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


请更新链接好吗?我想读这篇文章。
不幸的是,我在 oracle 网页上找不到原始文章。这是来自 Wayback 机器的版本:web.archive.org/web/20090601091119/http://java.sun.com/…
我在正常的 Oracle 方面再次找到了这篇文章 - 添加了回答链接。
d
davidxxx

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

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

JDK 类很少被弃用。
您可以在 the JDK 8 API deprecates list 上看到自第一个 JDK 以来弃用的所有类。
它只包含 Oracle 文档和 Java 社区不鼓励使用的一小部分类。< br> 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 可以做的所有事情,甚至更多。

你有答案。

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

然后,您可以利用 Path 类可用的丰富功能集。例如,假设您有一些删除文件的代码:

file.delete();

您可以修改此代码以使用 Files.delete 方法,如下所示:

Path fp = file.toPath();
Files.delete(fp);

简而言之,如果她/他愿意,她/他确实可以认为它已被弃用。
@mike 啮齿动物。确切地。从概念上讲,她/他应该,但出于解释的原因,就 Javadoc 而言并非如此。
i
irreputable

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


可以使用 Path.toFile() 将路径对象转换为文件对象,然后使用标准 API。
所以你的答案是“是但不是”?
A
Andrew S

Java.io.File 未被弃用。是的 java.nio.file.Path 更好,但只要还有很多程序和教科书使用 Java.io.File,如果只是出于遗留原因,它不应该被认为是弃用,它太重要了。这样做只是在工作中丢了一个扳手,而不会获得全部收益。例如,Android 框架将 File 用于其一些基本的文件处理功能,还有许多其他事情要做。


他没有问Path是否更好。他询问 File 是否已被弃用。
@EJP 我认为你有点过于迂腐了。 OP 确实询问了 java.io.File 是否已被弃用,我回答说......他还说“我相信 java.nio.file.Path 可以做 java.io.File 可以做的所有事情,甚至更多。”我只是在确认他的评论,几乎不值得一票否决。
M
Maged Almaweri

众所周知,java.nio 包中的类使用 Path 实例,而不是 File 实例。如果尽可能使用 java.nio,建议使用 Path 类。

现在有时您将不得不使用 File 类。那是因为方法或构造函数想要将 File 实例作为参数,但是当您确实有选择时,请确保使用 File 上的 Path。


m
mike rodent

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

这有点像说:“拿破仑是应该入侵俄罗斯,还是这些球芽甘蓝真的很好吃?”

至于问题的第二部分,您确实可以认为它已弃用。截至 2018 年 1 月,它没有被弃用。但是没有什么可以阻止你这样考虑。这是否会在今生或来生为你带来任何好处是不可能的。


我不明白你的比喻。
任何“或”问题都应该提出两种合乎逻辑的选择,这两种选择基本上都回答了同一个问题。
抱歉,在这种情况下,这听起来很迂腐。这个想法是“我想使用 File。我应该,是还是否?”
是的,我同意这是一个加载的问题......特别是因为许多现有的第 3 方 API 仍然使用 File。它不会很快死去。
it isn't deprecated. But there's nothing to stop you *considering* it so 哈哈。