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

时间:2017-07-13 06:20:33

标签: java io

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

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

那么他们为什么不写一个像#34; AsyncStream"或像#34; AsyncReader"实现NIO实施的目标。如果是这样,我们只有一个结构,它很漂亮。

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

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

1 个答案:

答案 0 :(得分:1)

我试图在上面的评论中理解您的想法,但我担心没有足够的细节来理解它作为提案。没有它,就不可能判断它是否有效。

然而,有几点可以作出回应:

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

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

除此之外,如果您尝试将同步和异步功能合并到一个API中,则冒险会产生以下情况:

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

现在可能无法保证这些担忧

但是,如果没有看到具体的API设计提案一个实现可用性和性能的实现,我们就无法分辨。请记住,I / O流和(然后)读者/编写者的原始优雅API设计实际上被证明存在各种问题。直到人们在生产代码中使用API​​时,这些才变得明显。例如:

  • 字符编码问题导致在Java 1.1中引入[self.navigationController pushViewController:YOUR_VIEWCONTROLLER animated:YES]; / Reader
  • 性能分析发现内存内存到内存的复制是一个问题,导致引入Writer等等。

总之,设计一个好的I / O API真的很难......而且Java也不太可能改变。