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

标签 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) 提供,也可以由在 channel 创建期间明确指定的 ExecutorService 提供)。
  • .NET 中的 FileStream 实现另一方面,将 FileOptions.Asynchronous 标志传递给底层操作系统(另请参见 Synchronous and Asynchronous I/O ),不会产生任何托管后台线程并使用所谓的 Overlapped I/O .

问题:

  • Java 中是否有任何(现有的或计划中的)文件 I/O API 将在 WindowsPOSIX AIO 上使用重叠 I/O在联合国? 更新:Windows-specific Java runtime features sun.nio.ch.WindowsAsynchronousFileChannelImpl 这正是 Overlapped I/O 之上的抽象层.
  • 是否有任何计划为文件 I/O 提供 java.nio.channels.SelectableChannel 实现?如果没有,技术限制是什么?

最佳答案

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

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

enter image description here

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

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

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

关于java - Java 中通过 POSIX AIO 或 Windows 重叠 IO 的异步文件 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54213736/

相关文章:

java - 被 java NIO Selector.select() 阻塞的线程应该被视为等待还是正在运行

java - 使用java就地修改文件内容

java - 将java swing应用程序连接到共享服务器上的ms access db的最佳方法?

java - 字符串列表到 double java列表

java - 为什么我的 while 循环需要这行代码才能运行?

java - Jdk 7 中的 FileChannel.open() 与 RandomAccessFile

java - 从使用 JWS 下载的 jar 文件中提取一些内容

Java 风格/最佳实践 - 将字段传递给方法与直接访问

java - 签名的 jar 文件还可以包含来自 'chain of trust' 的多个证书吗?

c++ - 使用制表符和空格读入文件