Java 7:路径与文件

dog*_*ane 191 java file-io nio path

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

我相信一个人java.nio.file.Path可以做一切可以做的事情java.io.File.

Don*_*dle 146

长话短说:

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文件系统

  • 您可以在此处阅读Oracle对差异的评论:http://docs.oracle.com/javase/tutorial/essential/io/legacy.html (11认同)
  • 另请注意,"文件"(复数形式)**不被**弃用.它本质上是一个抽象类,它对Path对象进行操作,并执行旧File类的许多功能,例如isDirectory()或exists() (3认同)
  • 现在我想知道:为什么JavaFX 8中新的File/FolderChooser对话框仍然使用`File`而不是`Path`? (2认同)
  • 路径是一个接口。要创建实例,请使用 Paths.get(filename)。这可能是因为必须编写 Files.exists(Paths.get(filename)) 而不是 new File(filename).exists() 的混淆,旧的 API 仍在使用。 (2认同)

use*_*421 18

我们可以考虑弃用吗?

不,你不能认为它被弃用,除非它在FileJavadoc中如此标记.

  • @Chris因为他们在1.02中更改了AWT事件模型,所以从JDK中删除了任何内容.它根本不是"显而易见的".这是不对的. (15认同)
  • 即使这是其中之一"因为RFC这样说" - 答案,我不认为这是一个好的答案.很明显,File将被Path取代.如果你想要提前,你可以立即开始使用Path并在需要时使用toFile(). (14认同)
  • @downvoters这个答案基本上是一个重言式.这不可能是错的.NB在我写这个答案后的五年里,随后出现了Java 8,并且`java.io.File`仍然没有删除,甚至也没有被弃用,并且Javadoc中仍然没有任何东西可以暗示这些东西中的任何一个都会发生. (5认同)
  • @EJP我刚刚赞同你的评论.但是,当你说答案是同义反复时,我并不完全确定你是对的.这个问题可能因为"基于意见"而被压制,"我们可以**考虑**它已被弃用".嗯,是的,OP和其他任何人**都可以**,但事实并非如此. (2认同)

Lor*_*ias 7

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

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


dav*_*xxx 6

我会完成非常好的回答@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.Filejava.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();
Run Code Online (Sandbox Code Playgroud)

然后,您可以利用 Path 类可用的丰富功能集。

例如,假设您有一些删除文件的代码:

file.delete();
Run Code Online (Sandbox Code Playgroud)

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

Path fp = file.toPath();
Files.delete(fp);
Run Code Online (Sandbox Code Playgroud)


irr*_*ble 5

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

  • 可以使用 [Path.toFile()](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html#toFile()) 将 Path 对象转换为 File 对象,然后使用标准 API。 (8认同)
  • 所以你的答案是“是但不是”? (3认同)