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.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文件系统
use*_*421 18
我们可以考虑弃用吗?
不,你不能认为它被弃用,除非它在File
Javadoc中如此标记.
查看这篇文章了解更多信息 - http://www.oracle.com/technetwork/articles/javase/nio-139333.html
基本上file.Path将是从现在开始的方式,但众所周知,Java人们倾向于保持背部兼容性,所以我猜这就是他们离开它的原因.
我会完成非常好的回答@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();
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)
是的,但是许多现有的 API,包括 Java7 自己的标准 API,仍然只适用于File
类型。