.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 将在 Windows 和 POSIX 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 个字:
这就是为什么在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/