La diferencia y comparación entre Java NIO e IO
1. Orientado a flujos y orientado a búfer
La primera y mayor diferencia entre Java IO y NIO es que IO está orientado a flujos y NIO está orientado a búfer. Java IO está orientado a la secuencia, lo que significa que se leen uno o más bytes de la secuencia a la vez y, hasta que se leen todos los bytes, no se almacenan en caché en ninguna parte. Además, no puede mover datos en la secuencia hacia adelante o hacia atrás. Si necesita mover los datos leídos de la secuencia de un lado a otro, primero debe almacenarlos en caché en un búfer. El enfoque orientado al búfer de Java NIO es ligeramente diferente. Los datos se leen en un búfer que procesa más tarde, moviéndose hacia adelante y hacia atrás en el búfer según sea necesario. Esto aumenta la flexibilidad en el procesamiento. Sin embargo, también debe verificar que el búfer contenga todos los datos que necesita procesar. Además, asegúrese de que a medida que se lean más datos en el búfer, los datos no procesados en el búfer no se sobrescriban.
2. IO con bloqueo y sin bloqueo
Las diversas corrientes de IO de Java son bloqueantes. Esto significa que cuando un hilo llama a read() o write(), el hilo se bloquea hasta que se leen algunos datos o hasta que los datos se escriben por completo. El hilo no puede hacer nada más durante este período. El modo sin bloqueo de Java NIO permite que un hilo envíe una solicitud para leer datos de un determinado canal, pero solo puede obtener los datos disponibles actualmente. Si no hay datos disponibles actualmente, no se obtendrá nada, en lugar de mantener el hilo. bloqueado, por lo que el hilo puede continuar haciendo otras cosas hasta que los datos sean legibles. Lo mismo ocurre con las escrituras sin bloqueo. Un hilo solicita escribir algunos datos en un canal, pero no necesita esperar a que se escriban por completo. Mientras tanto, el hilo puede hacer otras cosas. Los subprocesos suelen utilizar el tiempo de inactividad en IO sin bloqueo para realizar operaciones de IO en otros canales, por lo que un solo subproceso ahora puede administrar múltiples canales de entrada y salida.
3. Selectores (Selectores)
El selector de Java NIO permite que un hilo separado monitoree múltiples canales de entrada. Puede registrar múltiples canales usando un selector y luego usar un hilo separado para ". seleccione" canales que ya tengan entrada que pueda procesarse, o seleccione canales que estén listos para ser escritos. Este mecanismo de selección facilita que un solo hilo administre múltiples canales.