Как выбрать java nio vs io?
Как мы знали, если мы хотим использовать традиционный IO для построения сервера, он должен блокировать где-то, поэтому нам пришлось использовать режим цикла или один поток один сокет. Поэтому nio кажется, что это лучший выбор. Так что я хочу знать, если nio лучший выбор навсегда?
Ответы
Ответ 1
IMHO, блокирование ввода-вывода, как правило, является самым простым в использовании, и если у вас нет конкретного требования, которое требует больше от вашей системы, вы должны придерживаться простейшего варианта.
Следующим простейшим вариантом является блокирование NIO, которое я часто предпочитаю, если я хочу что-то более эффективное или контролирующее, чем IO. Он по-прежнему относительно прост, но позволяет использовать ByteBuffers. например ByteBuffers поддерживают немного endian.
Общим вариантом является использование неблокирующего NIO с Селекторами. Большая часть сложности, которую это вводит, может обрабатываться такими каркасами, как Netty или Mina. Я предлагаю вам использовать такую библиотеку, если вам нужен неблокирующий IO, например. потому что у вас есть тысячи одновременных подключений на сервер. ИМХО У вас есть тысячи подключений, вы должны подумать о том, что у вас больше серверов, если только каждое подключение не будет довольно тривиальным. AFAIK google перебирает больше серверов, а тысячи пользователей на сервер.
Более экстремальным вариантом является использование NIO2. Это еще сложнее и длиннее, чем писать без блокировки NIO. Я не знаю каких-либо структур, которые поддерживают это хорошо. то есть это происходит быстрее, когда вы это делаете. AFAIK Похоже, это стоит использовать, если у вас есть Infiniband (именно так он был разработан для поддержки), но, возможно, не стоит использовать, если у вас есть Ethernet.
Ответ 2
Если вы хотите неблокировать IO, NIO не лучший выбор - это выбор только на Java. Имейте в виду, что люди все еще используют старое IO регулярно, потому что это проще для кода. API NIO довольно сырой и является более доступной низкоуровневой технологией, чем API на стороне клиента. Я предлагаю использовать NIO через API, который обеспечивает более простой интерфейс для проблем, которые вы хотите решить, используя неблокирующий IO.
Ответ 3
Немного поздно, но лично я использую NIO даже для обычной ежедневной обработки файлов. Итак, я использую такие вещи, как:
1. if(Files.notExists(path)) { }
2. Files.createDirectory(path);
3. Files.newInputStream(path) targetPath.resolve("somefile.txt");
4. Files.newBufferedWriter(path, charset);
5. DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);
и он отлично работает для меня. Я предпочитаю Path вместо старого File из-за таких методов, как relativize или resolveSibling.
Не кажется мне более сложным, чем IO.
Ответ 4
Вы можете использовать любое из них, если только вы не собираетесь создавать "супер быстрый" сервер.
Конечно, хороший подход здесь - использовать nio, поскольку это новый и современный способ создания многоклиентских серверов для задач с высокой пропускной способностью.
Ответ 5
Вы использовали бы только NIO, если можете оправдать неизбежную сложность, которую он вводит. Если у вас нет каких-либо указаний относительно ожидаемой нагрузки, а также с точки зрения того, есть ли у вашего продукта/проекта ресурсы для поддержания соответствующего кода, тогда вы должны ошибаться с осторожностью и использовать IO.
Чтобы дать мой ответ немного, я только что провел три месяца, поддерживая и исправляя интеграционный уровень, в котором использовался необработанный Java NIO (т.е. не использовалась общая схема). По сути, дизайн был основан на потоках клиентов, добавляющих сообщения в очередь и небольшом количестве рабочих потоков, выполняющих магию NIO, а затем передает ответы обратно на потоки клиентов в зависимости от событий. Оглядываясь назад, я не могу оправдать первоначальное решение использовать NIO, так как это стало отвлечением, которое потребляло значительное количество времени, которое должно было быть потрачено на бизнес-логику более высокого уровня.
Ответ 6
Традиционный IO - это простой и упрощенный код, NIO более сложный, но более гибкий.
В моем случае я предпочитаю использовать IO для небольшой потоковой передачи и NIO для большой потоковой передачи, но nio действительно сложнее
с NIO я должен создать целый пакет для управления им, а не io-пакет, который я непосредственно использую snippet