Programación Java, las E/S se han llevado a cabo hasta hace poco utilizando una metáfora de flujo. Todas las E/S se ven como el movimiento de bytes individuales, uno cada vez, a través de un objeto llamado Stream. Stream I/O se usa para contactar al mundo exterior. También se usa internamente, para convertir objetos en bytes y luego volver a objetos.
NIO tiene la misma función y propósito que la E/S original, pero usa una E/S de bloque de metáfora diferente. java.nio (E/S nuevas/sin bloqueo)) API se introdujo con JDK1.4.
¿Cuál es la diferencia entre E/S de flujo y E/S de bloque?
Un sistema de E/S orientado a flujo trata los datos de un byte a la vez. Un flujo de entrada produce un byte de datos, y un flujo de salida consume un byte de datos. Es muy fácil crear filtros para los datos transmitidos. También es relativamente simple encadenar varios filtros para que cada uno haga su parte en lo que equivale a un único mecanismo de procesamiento sofisticado. Por otro lado, las E/S orientadas a flujos suelen ser bastante lentas.
Un sistema de E/S orientado a bloques trata los datos en bloques. Cada operación produce o consume un bloque de datos en un solo paso. Procesar datos por el bloque puede ser mucho más rápido que procesarlo por el byte (transmitido). Pero las E/S orientadas a bloques carecen de la elegancia y la simplicidad de las E/S orientadas a flujos.
¿Cuándo debería usar java.io y cuándo prefiere java.nio?
La escalabilidad probablemente guiará su elección de paquete. java.net requerirá un hilo por socket. Codificarlo será significativamente más fácil. java.nio es mucho más eficiente, pero es difícil de codificar.
Puede obtener una mejor escalabilidad una vez que se ocupan de decenas de miles de conexiones, pero en números menores probablemente obtendrá un mejor rendimiento con el bloqueo de E/S.
Al trabajar con SSL java.nio no es algo fácil de tratar
Importante: Si está trabajando con cualquiera de los paquetes, no es una buena idea para crear el marco de la nada hasta que ya menos que tenga una razón de peso para hacerlo asi que.
Para java.nio, los proyectos como Grizzly y Quick Server proporcionan componentes de servidor reutilizables que no bloquean.
Vale la pena leer Pain points with java.nio
Por último se reduce a los requisitos específicos de sus proyectos y lo que está tratando de lograr. Algunas de las mejores soluciones pueden no requerir la infraestructura más compleja en al
Actualización: Descubierto recientemente sobre el paquete NIO.2 que existe desde jdk 1.7. NIO.2 es diferente de NIO, la principal es que NIO.2 ofrece funcionalidad de canal asíncrono. NIO.2 primer
Si está trabajando con NIO, vale la pena conocer la diferencia y cuál se adapta a su propósito.
No es un * answser *, así que publicaré un comentario: [La página de Wikipedia en él] (http://en.wikipedia.org/wiki/New_I/O) discute algunos de los objetivos y las razones para la paquete nio. –
Siendo pedante, "Path" es parte de la biblioteca NIO2 agregada en Java 7. BTW: Si bien hay un montón de foco en sockets NIO que no bloquean, suelo utilizar Sockets NIO de bloqueo que son más simples de usar en mi humilde opinión. NIO2 Agregue NIO asíncrono para sockets y archivos. –