为什么Java IO不能实现异步读取?

Hal*_*end 10 java io

在Java IO中,我们使用Stream和Reader,而在NIO中我们使用Channel,Selector.

他们都做同样的事情,但结构完全不同.

那么为什么他们不编写像"AsyncStream"这样的新流或像"AsyncReader"这样的读者来实现NIO实现的功能.如果是这样,我们只有一个结构,它很漂亮.

那么为什么Java IO无法实现异步读取呢?使用Java IO实现异步读取有什么困难?

或者编写新框架而不是使用现有框架有什么好处?

Ste*_*n C 1

我试图在上面的评论中理解你的想法,但恐怕没有足够的细节来将其理解为提案。如果没有这一点,就无法判断它是否有效。

不过,有几点可以回应:

  • 如果 Java 是一种闪亮的新(且未发布)语言,那么他们可以在几个领域改进 I/O API 设计。
  • 此外,如果有人想出了一个经过深思熟虑、充实的 API 设计,结合了同步和异步功能,那么就可以考虑。

但 Java 并不是一门闪亮的新语言。它是一种古老的编程语言,有数十亿行源代码。您正在考虑对中央 API 进行的这种更改要么会给Oracle 的付费客户带来巨大的二进制兼容性问题,要么会导致巨大的遗留代码问题。这根本不会发生。

抛开这一点不谈,如果您尝试将同步和异步功能合并到单个 API 中,您可能会面临以下情况:

  • 自定义流类型需要实现很多额外的功能,和/或
  • 合并会导致意想不到的性能问题。

现在看来,这些担忧可能是多余的

然而,如果没有看到具体的 API 设计方案尝试可用性和性能的实现,我们就无法判断。请记住,最初针对 I/O 流和(当时的)读取器/写入器的优雅 API 设计实际上存在各种问题。直到人们在生产代码中使用 API 后,这些问题才变得明显。例如:

  • 出于对字符编码的考虑,Java 1.1 中引入了Reader/ 。Writer
  • 性能分析发现内存内存到内存的复制是一个问题,导致引入Buffer等等。

总而言之,设计一个好的 I/O API 确实很难……而且 Java 无论如何也不太可能改变。