通过POSIX AIO或Java中的Windows重叠IO的异步文件I / O.

.NET和.NET Core中的System.IO.File有一系列Read … Async()方法,所有这些方法都返回Task< byte []>或任务< string> (任务< 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中是否存在任何(现有的或计划的)File I / O API,它将使用Windows上的重叠I / O和Unices上的POSIX AIO?更新:特定于Windows的Java运行时功能sun.nio.ch.WindowsAsynchronousFileChannelImpl,它完全是重叠I / O之上的抽象层.
>有没有计划为File I / O提供java.nio.channels.SelectableChannel实现?如果不是,技术限制是什么?

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

我可以谈论它,但stollen图片值100个字:

《通过POSIX AIO或Java中的Windows重叠IO的异步文件I / O.》

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

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

希望它能回答你的问题.另外这里我还有一个阅读材料:
https://stackoverflow.com/a/2625565/8951886

点赞