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

Why isn't java.io.File deprecated?

从 Java 7 开始就有 java.nio.file 包。那么为什么 java.io.File 在 Java 8 中仍未被弃用?


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

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

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

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

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

3 - 一些"不太正确"的方面是 File.length() 为"/proc"树中的文件返回零,当您访问挂载在 Linux 上的 FAT 文件系统并尝试访问 if 时会发生奇怪的事情来自 Java。


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

文件从 Java 早期就已经存在;尽管存在无数缺陷(其中一些在这里列出,但还有其他缺陷),将所有代码迁移到"新"JSR 203 API(已经有 4 年历史!!)所需的工作量是巨大的.

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

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

  • 通过 FTP 的文件系统,
  • 另一个 over Dropbox,
  • 另一个通过 box.com,
  • 开发新文件系统的辅助库,
  • 最后是一个补充 JDK Files 的辅助库(并修复了过程中的一些错误)。

在这个阶段,这是一个耐心的问题;用新的方式回答关于 SO 的问题,甚至是老问题等。这是一场艰苦的战斗。


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

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

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

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

所以我怀疑前进的方向可能是"您需要多少 API?"如果您需要改进 Channels 的功能,增加 Paths 的独立性等,那么 NIO 绝对是没有选择的方法。

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


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161