对于用Java 7编写的新应用程序,是否有任何理由再使用java.io.File
对象,或者我们是否可以认为它已被弃用?
我相信java.nio.file.Path
可以完成java.io.File
可以做的所有事情。
答案 0 :(得分:137)
长话短说:
java.io.File
很可能从不被弃用/不受支持。也就是说,java.nio.file.Path
是更现代的java.nio.file
lib的一部分,并且所有java.io.File
都可以,但通常以更好的方式,更多。
对于新项目,请使用Path
。
如果您需要File
遗产对象,请致电Path#toFile()
从文件迁移到路径
Article by Janice J. Heiss and Sharon Zakhour, May 2009, discussing NIO.2 File System in JDK 7
答案 1 :(得分:15)
我们可以考虑弃用吗?
不,你不能认为它已被弃用,除非并且直到它在File
Javadoc中如此标记。
答案 2 :(得分:7)
查看此文章了解更多信息 - http://www.oracle.com/technetwork/articles/javase/nio-139333.html
基本上file.Path将是从现在开始的方式,但众所周知,Java人们倾向于保持背部兼容性,所以我猜这就是他们离开它的原因。
答案 3 :(得分:4)
是的,但许多现有的API(包括Java7自己的标准API)仍然只能使用File
类型。
答案 4 :(得分:3)
我将完成@mmcrae
的非常好的答案。
是否有任何理由再使用java.io.File对象,或者我们可以 认为它已被弃用?
JDK类很少被弃用
您可以在the JDK 8 API deprecates list上看到自第一个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可以做的所有事情 等等。
你有答案。
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方法,该方法转换了 旧样式文件实例到java.nio.file.Path实例,如下所示:
Path input = file.toPath();
然后,您可以利用可用的丰富功能集 路径类。
例如,假设您有一些删除文件的代码:
file.delete();
您可以修改此代码以使用Files.delete方法,如下所示:
Path fp = file.toPath();
Files.delete(fp);
答案 5 :(得分:1)
不推荐使用Java.io.File。是的java.nio.file.Path是更好的,但只要有大量的程序和教科书使用Java.io.File,如果仅出于遗留原因,它不应被视为已弃用,它太重要了。这样做只会在工作中投入一把扳手而不会获得任何好处。例如,Android框架使用File来实现一些基本的文件处理功能,还有许多其他功能。
答案 6 :(得分:0)
众所周知,java.nio 包中的类使用 Path 实例,而不是 File 实例。如果尽可能使用 java.nio,建议使用 Path 类。
现在有时您将不得不使用 File 类。那是因为方法或构造函数想要将 File 实例作为参数,但是当您有选择时,请确保在 File 上使用 Path。
答案 7 :(得分:-8)
对于用Java 7编写的新应用程序,是否有任何理由使用 java.io.File对象了,还是我们可以考虑弃用它?
这有点像说:"如果拿破仑入侵俄罗斯, 或 这些布鲁塞尔豆芽真的好吃吗?"
关于问题的第二部分,您确实可以认为它已被弃用。截至2018年1月,它不被弃用。但是没有什么可以阻止你 考虑 。这是否会在今生或下一代中获得任何优势是不可能的。