从Java 7开始,java.nio.file
包。那么为什么{8}仍然没有在Java 8中弃用?
答案 0 :(得分:6)
它没有被弃用,因为它没有被破坏。
Oracle(以及之前的Sun)保留了对被认为有害使用的API的弃用,并且在不破坏二进制(或语义)兼容性的情况下无法修复。
java.io.File
API只是过时而且笨重的 1 ,没有害处。还有其他标准API依赖于File
,更不用说许多第三方API和(可能)数百万行客户代码。没有必要向世界发出信号,要求对所有代码进行全面检查。
1 - @fge指出某些File方法在某些Java版本的某些平台(特别是Windows / AD)上表现不正常。但是,这些是实现错误,而不是基本的API缺陷。在UNIX / Linux平台上,方法语义或多或少是正确的 2 。
2 - 一些不太正确的"方面是File.length()
为" / proc"中的文件返回零。树,当您访问安装在Linux上的FAT文件系统并尝试从Java访问时,会发生奇怪的事情。
答案 1 :(得分:2)
因为它在JDK中根深蒂固。
自Java早期以来,文件一直存在;尽管存在无数的缺陷(some of them listed here,但还有其他缺陷),将所有代码迁移到" new"所需的工作量。 JSR 203 API(已经4年了!!)是巨大的。
主要问题实际上是JSR 203的意识,或缺乏意识;即使在今天,网上的绝大多数教程仍然使用File;最好的办法是使用JSR 203编写更多教程,使用它编写更多代码等等。
我实际上是新API的主要支持者之一,在这方面令人讨厌:),但我确实有代码来证明我的观点:
Files
(并在此过程中修复了一些错误)。在这个阶段,这是一个耐心的问题;使用新的方式回答关于SO的问题,甚至是老问题等。这是一场艰苦的战斗。
答案 2 :(得分:1)
这不仅仅是遗产。较新的API继续使用文件对象( 路径 + NIO.Files + 频道 )组合,因为要理解的API要简单得多。
我不提倡使用它。但只是指出单个旧的文件对象API为暴露API提供了一个点,一些寻求简单性的开发人员倾向于这一点。
许多开发人员很难掌握 Path 和 File 之间的区别。它们是两个不同的东西,这就是为什么我们仍然有java.nio.file。文件和java.nio.file一起。路径。 Path就像一个URI,一个定位器,它不必指向任何东西。而文件是文件系统对象的具体表示。
NIO将这些概念分开,而旧的API将它们全部保存在一个对象中。我不认为本身必然错误。它只是在 File 对象中捕获了许多有用的Path相关API,其中该API在这些对象之外是有用的。
所以我怀疑前进的方向可能是“你需要多少API?”如果你需要改进Channels的功能,增加Paths的独立性等等,那么NIO肯定是通往没有选择真的。
如果您是初级开发人员或学生需要快速且基本的面向对象的方式来打开文件系统对象并在关闭之前运行一些标准FS API调用,为什么不使用更简单的文件对象?毕竟Java不仅仅适用于专家。