.NET和.NET Core中的System.IO.File具有一系列Read...Async()方法,所有方法均返回Task<byte[]>Task<string>(Task<T>与Java的Future<T>等效于.NET)。

这看起来基本上等效于AsynchronousFileChannel API(它们使用CompletionHandler或返回Future),但有一个主要区别。

  • AsynchronousFileChannel使用托管后台线程执行异步I/O(该线程可以由默认线程池(sun.nio.ch.ThreadPool)提供,也可以由 channel 创建期间明确指定的ExecutorService提供)。
  • 另一方面,.NET中的
  • FileStream实现将 FileOptions.Asynchronous 标志传递给底层操作系统(另请参见Synchronous and Asynchronous I/O),不产生任何托管后台线程,而是使用所谓的Overlapped I/O

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

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

    我可以谈谈,但乱七八糟的图片值得100个字:

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

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

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

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

    10-06 13:43
    查看更多