2012-04-29 14 views
16

Estaba aprendiendo el paquete java nio y me di cuenta de que hay muchos métodos ya proporcionados por File que nio.Files proporciona de nuevo mediante la clase Path. Como esos pocos que obtuve. En realidad, no estoy obteniendo cuál es el uso real del paquete nio.¿Cuál es el uso exacto del paquete java nio cuando ya hay métodos disponibles con el paquete io

Soy muy nuevo en este paquete, por lo que es posible que mi pregunta sea incorrecta, pero un poco de ayuda puede ayudarme a leer más.

+2

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. –

+0

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. –

Respuesta

8

La principal diferencia entre IO y NIO es que IO está bloqueando, mientras que NIO no está bloqueando.

This article explica las diferencias en los paquetes y qué IO de bloqueo y de no bloqueo es.

+22

Por favor, no publique solo un enlace. Cuando ese enlace muere, también lo hace esta respuesta. –

+2

NIO puede ser de bloqueo, no bloqueo o asíncrono. Esta no es la principal diferencia en absoluto. – EJP

+0

@Deco El factor de bloqueo también es válido para 'java.io.File' frente a' java.nio.file'? – overexchange

1

Casi todos los métodos en java.io.File tienen problemas que no se pueden solucionar por razones de compatibilidad, el más obvio es que los métodos devuelven un valor booleano cuando fallan. Estos problemas, más el deseo de admitir sistemas de archivos conectables y muchas otras cosas, requirieron el desarrollo de una API de sistema de archivos completamente nueva, por eso se creó java.nio.file.

7

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?

  1. 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.

  2. 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.

  3. 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.

+0

Creo que esta es la mejor respuesta – lolski

+0

Y esta respuesta parece ser copiar y pegar de un libro ... – CuriousMind

2

Java NIO: Canales y tampones
En el API estándar IO se trabaja con flujos de bytes y flujos de caracteres. En NIO, trabaja con canales y búferes. Los datos siempre se leen de un canal a un búfer, o se escriben desde un búfer a un canal.

Java NIO: sin bloqueo IO
Java NIO le permite hacer sin bloqueo IO. Por ejemplo, un hilo puede pedirle a un canal que lea datos en un búfer. Mientras el canal lee datos en el búfer, el hilo puede hacer otra cosa. Una vez que se leen los datos en el búfer, el hilo puede continuar procesándolo. Lo mismo es cierto para escribir datos en canales.

Java NIO: Selectores
Java NIO contiene el concepto de "selectores". Un selector es un objeto que puede monitorear múltiples canales para eventos (como: conexión abierta, datos recibidos, etc.). Por lo tanto, un solo hilo puede monitorear múltiples canales de datos.
More detail on orcale

0

NIO también presentó los canales que resumen la especialización en Stream - File, Socket, Network.

Cuestiones relacionadas