Асинхронный файловый ввод / вывод через POSIX AIO или Windows Ilapped IO в Java - PullRequest
0 голосов
/ 16 января 2019

System.IO.File в .NET и .NET Core имеет семейство Read...Async() методов, каждый из которых возвращает либо Task<byte[]>, либо Task<string> (Task<T> .NET эквивалент Java Future<T>).

Это выглядит в значительной степени эквивалентно AsynchronousFileChannel API (которые либо потребляют CompletionHandler, либо возвращают Future), с одним существенным отличием.

  • AsynchronousFileChannel использует управляемый фоновый поток для выполнения асинхронного ввода-вывода (поток может быть предоставлен либо пулом потоков по умолчанию (sun.nio.ch.ThreadPool), либо ExecutorService, явно указанным при создании канала).
  • FileStream в .NET , с другой стороны, передает флаг FileOptions.Asynchronous в базовую операционную систему (см. Также Синхронный и асинхронный ввод / вывод ), не создает никаких управляемых фоновых потоков и использует так называемый перекрывающийся ввод-вывод .

Вопросы:

  • Существует ли (существующий или запланированный) API-интерфейс файлового ввода-вывода в Java , который будет использовать перекрывающийся ввод-вывод в Windows и POSIX AIO в Unices? Обновление : Windows -специфичные Java функции времени выполнения sun.nio.ch.WindowsAsynchronousFileChannelImpl, который в точности является слоем абстракции поверх Overlapped I / O .
  • Планируется ли предоставить java.nio.channels.SelectableChannel реализации для файлового ввода-вывода? Если нет, каковы технические ограничения?

1 Ответ

0 голосов
/ 16 января 2019

Это не совсем возможно. Целый IO API должен быть повторно реализован. NIO означает неблокирующий ввод / вывод, это не то же самое, что асинхронный ввод / вывод. Неблокирующая реализация реализована в JAVA и вкратце, это означает, что ОС не имеет возможности уведомлять среду выполнения о завершении операции. Isned Java использует системные вызовы select() или poll(), чтобы проверить, доступны ли данные.

Я мог бы поговорить об этом, но украденная картинка стоит 100 слов:

enter image description here

Именно поэтому в JAVA требуется отдельный поток для постоянного вызова check, check, check, check .....

Я не знаю платформу .NET, но если то, что вы опубликовали, правильно, то используется асинхронный ввод-вывод, поэтому последний столбец. Но я не доверяю ничему, что исходит от Microsoft.

Надеюсь, это ответит на ваш вопрос. Также здесь я дополнительный материал для чтения: https://stackoverflow.com/a/2625565/8951886

...