De los tres
¿Cuál es más preferido en la vida real para la E / S de archivos en Java y por qué?
Prefiero canales para que los datos binarios se pongan en archivo o se lean y BufferedReader / Writer para datos de cadena
java.io usa Streams
mientras java.nio usa Channels
y buffer
, la distinción más importante entre java.io way y java.nio way es, cómo se empaquetan y transmiten los datos.java.io trata los datos en secuencias (un byte a la vez), mientras que java.nio trata los datos en bloques. El procesamiento de datos por bloque puede ser mucho más rápido que procesarlo por el byte (transmitido) pero no es tan fácil como las transmisiones.
En estas situaciones, es mejor usar java.io way:
En estas situaciones, es mejor usar java.nio:
Puede ver los siguientes enlaces para obtener más información:
http://www.skill-guru.com/blog/2010/11/14/java-nio-vs-java-io-which-one-to-use/
http://blogs.oracle.com/slc/entry/javanio_vs_javaio
Realmente debería ser una cuestión de función más que de preferencia.
Utiliza lectores y escritores para datos orientados a caracteres (que requieren codificación y decodificación), flujos de entrada / salida para datos orientados a bytes y flujos binarios si los datos codifican datos binarios.
Utiliza las clases BufferedXxx si necesita E / S con la granularidad de un carácter o byte. Son una manera simple de evitar los graves problemas de rendimiento que pueden ocurrir si realiza muchas llamadas syscate byte a la vez.
Si solo hace E / S leyendo / escribiendo fragmentos grandes, entonces las clases BufferedXxx en realidad podrían reducir un poco el rendimiento. Puede usar lectores / escritores / secuencias simples (con grandes
char[]
obyte[]
buffers), o Canales y XxxBuffers. Estos últimos son potencialmente más rápidos, pero las API son más incómodas.Utiliza canales si necesita gastos generales bajos, y / o hace cosas especializadas como "seleccionar" de múltiples flujos, dispersión / recopilación y acceso a archivos mapeados en memoria.
Como puede ver, las diferentes API están diseñadas para diferentes propósitos. En algunos casos de uso hay superposición, en otros solo una API es adecuada para este propósito.
El problema con el desarrollo de una "preferencia" por un estilo de E / S sobre otro es que conduce a un mal software; es decir, código que es ineficiente donde se necesita la eficiencia de E / S, o demasiado complicado donde la eficiencia de E / S no debería ser una preocupación.
fuente
read
o de laswrite
llamadas que realiza una aplicación. Si todos son grandes (lo suficiente), leen y escriben en / desde una matriz de bytes, entonces omitirán los buffers BufferedXxx y se asignarán directamente a las llamadas de lectura / escritura en la secuencia subyacente. En ese caso específico, los contenedores BufferedXxx no están ayudando al rendimiento.La respuesta es "depende": las E / S almacenadas en búfer, de transmisión, de bloqueo y sin bloqueo se utilizan para diferentes propósitos, dependiendo de la concurrencia, el rendimiento y otras características de rendimiento que se busquen.
fuente