为什么不推荐使用 java.io.File?

问题描述 投票:0回答:3

自 Java 7 以来,就有了

java.nio.file
包。那么为什么
java.io.File
仍然没有在 Java 8 中弃用?

java file io deprecated
3个回答
8
投票

它没有被弃用,因为它没有被破坏。或者更准确地说,因为 Java 团队和/或 Oracle 管理层认为它的破坏程度不足以保证

File
的弃用会导致 1.

Oracle(以及之前的 Sun)保留弃用被认为有害/危险的 API,并且在不破坏二进制(或语义)兼容性的情况下无法修复。

java.io.File
API 只是老式和笨拙的2,但不会直接有害。还有其他依赖于
File
的标准 API,更不用说许多第 3 方 API 和(可能)数百万行客户代码。没有必要向世界发出所有代码都需要大修的信号。


1 - 显然,有些人会不同意。

2 - @fge 指出某些 File 方法在某些平台(特别是 Windows / AD)的某些 Java 版本中无法正常运行。然而,那些是/是实现错误,而不是基本的 API 缺陷。在 UNIX / Linux 平台上,方法语义或多或少是正确的2.

3 - 几个“不太正确”的方面是

File.length()
为“/proc”树中的文件返回零,并且当您访问安装在 Linux 上的 FAT 文件系统并尝试访问时会发生奇怪的事情如果从Java.


3
投票

因为它在 JDK 中太根深蒂固了。

File 在 Java 早期就有了;尽管它有无数的缺陷(这里列出了其中的一些,但还有其他的),将所有代码迁移到“新”JSR 203 API(已经 4 岁了!!)是巨大的。

主要问题实际上是对JSR 203的认识,或缺乏;即使在今天,网络上的绝大多数教程仍然使用 File;最好的办法是使用 JSR 203 编写更多教程,使用它编写更多代码等等。

我实际上是新 API 的主要支持者之一,以至于在这方面很烦人:),但我确实有代码来证明我的观点:

这个阶段,就是耐心的问题;使用新方法甚至旧问题等回答有关 SO 的问题。这是一场艰苦的战斗。


2
投票

这不仅仅是遗产。较新的 API 继续在 ( Path + NIO.Files + Channel ) 组合上使用 File 对象,因为它的 API 更容易理解。

提倡使用它。但只是指出单一的旧 File 对象 API 提供了一个单一的点来公开一些寻求简单的开发人员所倾向于的 API。

许多开发人员更难掌握 PathFile 之间的区别。它们是两个不同的东西,这就是为什么我们仍然有 java.nio.file.Files 和 java.nio.file.Paths。 Path 就像一个 URI,一个定位器,它不必指向任何东西。而文件是文件系统对象的具体表示。

NIO 将这些概念分开,而旧的 API 将它们全部保存在一个对象中。我不认为这 necessarily 本身是错误的。它只是在 File 对象中捕获了很多有用的 Path 相关 API,其中该 API 在这些对象之外很有用。

所以我怀疑前进的方向可能是“你需要多少API?”如果你需要改进通道的功能,增加路径的独立性等,那么NIO绝对是没有选择的方式。

如果您是初级开发人员或学生,需要一种快速且基本的面向对象的方式来打开文件系统对象并在关闭前运行一些标准的 FS API 调用,为什么不使用更简单的 File 对象呢?毕竟,Java 不仅仅适用于专家。

© www.soinside.com 2019 - 2024. All rights reserved.