Java中通过POSIX AIO或Windows Overlapped IO进行异步文件I / O

时间:2019-01-16 09:17:17

标签: java io nio aio overlapped-io

.NET .NET Core 中的

System.IO.File有一系列Read...Async()方法,所有方法都返回Task<byte[]>Task<string>Task<T> .NET 的等同于 Java的 Future<T>)。

这看起来与AsynchronousFileChannel API(它们消耗CompletionHandler或返回Future)基本相同,但有一个主要区别。

  • AsynchronousFileChannel使用托管后台线程执行异步I / O(该线程可以由默认线程池(sun.nio.ch.ThreadPool)提供,也可以由通道期间显式指定的ExecutorService提供创作)。
  • 另一方面, .NET 中的
  • FileStream实现将FileOptions.Asynchronous标志传递给基础操作系统(另请参见Synchronous and Asynchronous I/O),但不会产生所有托管后台线程,并使用所谓的Overlapped I/O

问题:

  • Java 中是否有任何(现有或计划中的)文件I / O API,它们将在 Windows 上使用 Overlapped I / O 和{ {3}}在Unices上? 更新 Windows 特定的 Java 运行时功能POSIX AIO恰好是重叠I / O之上的抽象层
  • 是否有计划为文件I / O提供java.nio.channels.SelectableChannel实现?如果没有,技术限制是什么?

1 个答案:

答案 0 :(得分:1)

这是不可能的。整个IO API必须重新实现。 NIO表示非阻塞I / O,它与异步I / O不同。非阻塞是在JAVA中实现的,长话短说,这意味着OS无法通知运行时操作已完成。 Isned Java使用select()poll()系统调用来检查数据是否可用。

我可以谈谈,但是偷照片要花100个字:

enter image description here

这就是为什么在JAVA中需要单独的线程来不断调用check,check,check,check .....

我不知道.NET平台,但是如果发布的内容正确,则使用异步I / O,所以最后一列。但是我不相信来自微软的任何东西。

希望它能回答您的问题。另外,我在这里还有其他阅读材料: https://stackoverflow.com/a/2625565/8951886