Fluxo de caracteres versus fluxo de bytes em Java

Fluxo de caracteres versus fluxo de bytes em Java

Um fluxo é um fluxo contínuo de dados. Em Java, os fluxos de E/S são usados ​​para ler fontes de entrada ou gravar em destinos de saída, como arquivos. Eles fornecem uma maneira de acessar dados sequencialmente. O pacote java.io inclui classes para lidar com fluxos de bytes e fluxos de caracteres e também para conversão entre eles.

  • Fluxo de entrada: lê dados da fonte. 
  • Fluxo de saída: grava dados em um destino. 

Quando usar o fluxo de caracteres em vez do fluxo de bytes:

Em Java, os caracteres são armazenados usando convenções Unicode. O fluxo de caracteres é útil quando queremos processar arquivos de texto. Esses arquivos de texto podem ser processados ​​caractere por caractere. O tamanho dos caracteres é normalmente de 16 bits.

Quando usar o fluxo de bytes em vez do fluxo de caracteres:

Orientado a bytes lê byte por byte. Um fluxo de bytes é adequado para processar dados brutos, como arquivos binários.

Pontos-chave ao usar e lidar com qualquer um dos fluxos acima:

  • As classes de fluxo de caracteres geralmente terminam com Reader/Writer, enquanto as classes de fluxo de bytes terminam com InputStream/OutputStream.
  • Os códigos de exemplo neste artigo usam fluxos sem buffer que são menos eficientes. Para melhor desempenho, geralmente os agrupamos com BufferedReader/BufferedWriter (fluxos de caracteres) ou BufferedInputStream/BufferedOutputStream (fluxos de bytes).
  • Sempre feche os fluxos após o uso para liberar recursos e evitar erros.
  • Os códigos acima podem não funcionar em compiladores online porque os arquivos podem não existir.

Fluxo de caracteres

Em Java, os caracteres são armazenados usando convenções Unicode. O fluxo de caracteres nos permite ler/gravar dados caractere por caractere automaticamente. Por exemplo, FileReader e FileWriter são fluxos de caracteres usados ​​para ler da origem e gravar no destino.

não_unicode_bytesFluxos de personagens

Exemplo

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  ();      }      }   }   

Saída:

Grava conteúdo no arquivo de destino caractere por caractere

Programa executado com sucesso

Fluxo de bytes

Um fluxo de bytes em Java é um fluxo que lida com entrada e saída de dados binários brutos de 8 bits. É usado principalmente para ler e gravar dados não textuais, como imagens, áudio e vídeo ou qualquer arquivo binário. Por exemplo FileInputStream é usado para ler a origem e FileOutputStream para gravar no destino.

Exemplo:

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  ();      }      }   }   

Saída:

Programa executado com sucesso

Diferenças entre fluxo de caracteres e fluxo de bytes

Aspecto Fluxo de caracteres Fluxo de bytes
Tipo de dados manipulado Caracteres Unicode de 16 bits (texto) Dados brutos de 8 bits (binário)
As aulas terminam com Leitor/Escritor InputStream / OutputStream
Adequado para Arquivos de texto Dados Unicode Imagens arquivos binários de áudio e vídeo
Conversão Converte bytes em caracteres automaticamente Nenhuma conversão funciona com bytes brutos
Exemplos FileReaderFileWriter FileInputStream

Artigo relacionado

  • Java IO - Entrada/Saída em Java com exemplos