¿Qué se prefiere para E / S de archivo en Java? [cerrado]

8

De los tres

  • BufferedReader / Writer
  • Flujos binarios
  • Canales

  • ¿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

    Dummy Derp
    fuente

    Respuestas:

    18

    java.io usa Streamsmientras java.nio usa Channelsy 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:

    • Los archivos pueden ser grandes pero no enormes. Es posible leer un archivo completo en la memoria.
    • Una aplicación lee o escribe en unos pocos archivos o conexiones de red al mismo tiempo, idealmente usando solo una secuencia a la vez.
    • La aplicación es secuencial. No podrá hacer mucho hasta que termine de leer o escribir un archivo.

    En estas situaciones, es mejor usar java.nio:

    • Una aplicación que necesita dar servicio a cientos o miles de conexiones simultáneamente.

    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

    https://www.ibm.com/developerworks/java/tutorials/j-nio/

    http://java.dzone.com/articles/java-nio-vs-io

    Saeed Zarinfam
    fuente
    Encuentro canales más fáciles que las transmisiones java.io.
    Dummy Derp
    77
    Bien por ti, porque casi todos (como yo) dicen que el modelo de programación nio es complicado que el java io tradicional.
    Saeed Zarinfam
    4

    ¿Cuál es más preferido en la vida real para la E / S de archivos en Java y por qué?

    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[]o byte[]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.

    Stephen C
    fuente
    "Si solo hace E / S leyendo / escribiendo fragmentos grandes, entonces las clases BufferedXxx podrían en realidad reducir un poco el rendimiento" ... No entiendo este punto. ¿No es el objetivo de usar BufferedXxx en primer lugar para que hagas IO por fragmentos y no por un solo byte / charater, etc. y eso reduce la cantidad de llamadas del sistema al kernel? ¿Puedes explicar a qué te referías exactamente?
    Geek
    Me refiero al tamaño del real reado de las writellamadas 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.
    Stephen C
    Veo el punto que estabas haciendo. Gracias por el seguimiento. +1.
    Geek
    3

    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.

    Martijn Verburg
    fuente