Flujo de caracteres versus flujo de bytes en Java

Flujo de caracteres versus flujo de bytes en Java

Un flujo es un flujo continuo de datos. En Java, los flujos de E/S se utilizan para leer desde fuentes de entrada o escribir en destinos de salida, como archivos. Proporcionan una forma de acceder a los datos de forma secuencial. El paquete java.io incluye clases para manejar flujos de bytes y flujos de caracteres y también para realizar conversiones entre ellos.

  • Flujo de entrada: lee datos de la fuente. 
  • Flujo de salida: escribe datos en un destino. 

Cuándo utilizar Character Stream en lugar de Byte Stream:

En Java, los caracteres se almacenan mediante convenciones Unicode. El flujo de caracteres es útil cuando queremos procesar archivos de texto. Estos archivos de texto se pueden procesar carácter por carácter. El tamaño de los caracteres suele ser de 16 bits.

Cuándo utilizar Byte Stream en lugar de Character Stream:

Orientado a bytes lee byte a byte. Un flujo de bytes es adecuado para procesar datos sin procesar, como archivos binarios.

Puntos clave al usar y tratar cualquiera de las corrientes anteriores:

  • Las clases de flujo de caracteres generalmente terminan con Reader/Writer, mientras que las clases de flujo de bytes terminan con InputStream/OutputStream.
  • Los códigos de ejemplo de este artículo utilizan transmisiones sin búfer que son menos eficientes. Para un mejor rendimiento, normalmente los envolvemos con BufferedReader/BufferedWriter (flujos de caracteres) o BufferedInputStream/BufferedOutputStream (flujos de bytes).
  • Cierre siempre las transmisiones después de su uso para liberar recursos y evitar errores.
  • Es posible que los códigos anteriores no se ejecuten en compiladores en línea ya que es posible que los archivos no existan.

Flujo de personajes

En Java, los caracteres se almacenan mediante convenciones Unicode. El flujo de caracteres nos permite automáticamente leer/escribir datos carácter por carácter. Por ejemplo, FileReader y FileWriter son secuencias de caracteres que se utilizan para leer desde el origen y escribir en el destino.

bytes_no_unicodeFlujos de personajes

Ejemplo

Java
   import     java.io.*  ;   public     class   GFG     {      public     static     void     main  (  String  []     args  )      throws     IOException      {      // Initially assigning null as we have not read anything      FileReader     sourceStream     =     null  ;      try     {      // Reading from file      sourceStream     =     new     FileReader  (  '/Users/mayanksolanki/Desktop/demo.rtf'  );      // Reading sourcefile and writing content to target file character by character.      int     temp  ;      // If there is content inside file than read      while     ((  temp     =     sourceStream  .  read  ())     !=     -  1  )      System  .  out  .  println  ((  char  )  temp  );          System  .  out  .  print  (  'Program successfully executed'  );      }          finally     {      if     (  sourceStream     !=     null  )      sourceStream  .  close  ();      }      }   }   

Producción:

Escribe contenido en el archivo de destino carácter por carácter.

Programa ejecutado exitosamente

Flujo de bytes

Un flujo de bytes en Java es un flujo que maneja la entrada y salida de datos binarios sin formato de 8 bits. Se utiliza principalmente para leer y escribir datos que no son de texto, como imágenes, audio, vídeo o cualquier archivo binario. Por ejemplo flujo de entrada de archivos se utiliza para leer desde el origen y FileOutputStream para escribir en el destino.

Ejemplo:

Java
   import     java.io.*  ;   public     class   GFG     {      public     static     void     main  (  String  []     args  )      throws     IOException      {      // Initially assigning null ot objects for reading and writing to file      FileInputStream     sourceStream     =     null  ;      FileOutputStream     targetStream     =     null  ;      try     {      // Passing the files via local directory      sourceStream     =     new     FileInputStream  (  '/Users/mayanksolanki/Desktop/demo.rtf'  );      targetStream     =     new     FileOutputStream  (  '/Users/mayanksolanki/Desktop/democopy.rtf'  );      // Reading source file and writing content to file byte by byte      int     temp  ;      // If there is content inside file than read      while     ((  temp     =     sourceStream  .  read  ())     !=     -  1  )      targetStream  .  write  ((  byte  )  temp  );          System  .  out  .  print  (  'Program successfully executed'  );      }      // finally block that executes for sure where we are closing file connections to avoid memory leakage      finally     {      if     (  sourceStream     !=     null  )      sourceStream  .  close  ();      if     (  targetStream     !=     null  )      targetStream  .  close  ();      }      }   }   

Producción:

Programa ejecutado exitosamente

Diferencias entre flujo de caracteres y flujo de bytes

Aspecto Flujo de personajes Flujo de bytes
Tipo de datos manejados Caracteres Unicode de 16 bits (texto) Datos sin procesar de 8 bits (binarios)
Las clases terminan con Lector / Escritor Flujo de entrada/flujo de salida
Adecuado para Archivos de texto Datos Unicode Imágenes audio vídeo archivos binarios
Conversión Convierte bytes a caracteres automáticamente Ninguna conversión funciona con bytes sin formato
Ejemplos Lector de archivosEscritor de archivos ArchivoInputStream ArchivoOutputStream

Artículo relacionado

  • Java IO: entrada/salida en Java con ejemplos