Strumień znaków kontra strumień bajtów w Javie

Strumień znaków kontra strumień bajtów w Javie

Strumień to ciągły przepływ danych. W Javie strumienie we/wy służą do odczytu ze źródeł wejściowych lub zapisu do miejsc docelowych, takich jak pliki. Umożliwiają sekwencyjny dostęp do danych. Pakiet java.io zawiera klasy do obsługi zarówno strumieni bajtów, jak i strumieni znaków, a także do konwersji między nimi.

  • Strumień wejściowy: odczytuje dane ze źródła. 
  • Strumień wyjściowy: zapisuje dane do miejsca docelowego. 

Kiedy używać strumienia znaków zamiast strumienia bajtów:

W Javie znaki są przechowywane przy użyciu konwencji Unicode. Strumień znaków przydaje się, gdy chcemy przetwarzać pliki tekstowe. Te pliki tekstowe można przetwarzać znak po znaku. Rozmiar znaku wynosi zazwyczaj 16 bitów.

Kiedy używać strumienia bajtów zamiast strumienia znaków:

Zorientowany na bajt czyta bajt po bajcie. Strumień bajtów nadaje się do przetwarzania surowych danych, takich jak pliki binarne.

Kluczowe punkty podczas używania i postępowania z którymkolwiek z powyższych strumieni:

  • Klasy strumieni znaków zwykle kończą się na Reader/Writer, podczas gdy klasy strumieni bajtów kończą się na InputStream/OutputStream.
  • Przykładowe kody w tym artykule wykorzystują strumienie niebuforowane, które są mniej wydajne. Aby uzyskać lepszą wydajność, zwykle otaczamy je BufferedReader/BufferedWriter (strumienie znaków) lub BufferedInputStream/BufferedOutputStream (strumienie bajtów).
  • Zawsze zamykaj strumienie po użyciu, aby zwolnić zasoby i zapobiec błędom.
  • Powyższe kody mogą nie działać w kompilatorach online, ponieważ pliki mogą nie istnieć.

Strumień postaci

W Javie znaki są przechowywane przy użyciu konwencji Unicode. Strumień znaków automatycznie pozwala nam czytać/zapisywać dane znak po znaku. Na przykład FileReader i FileWriter to strumienie znaków używane do odczytu ze źródła i zapisu do miejsca docelowego.

non_unicode_bytesStrumienie postaci

Przykład

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

Wyjście:

Zapisuje treść do pliku docelowego znak po znaku

Program pomyślnie wykonany

Strumień bajtów

Strumień bajtów w Javie to strumień obsługujący wejście i wyjście surowych 8-bitowych danych binarnych. Używany jest głównie do odczytu i zapisu danych nietekstowych, takich jak obrazy audio wideo lub dowolne pliki binarne. Na przykład Strumień wejściowy pliku służy do odczytu ze źródła, a FileOutputStream do zapisu do miejsca docelowego.

Przykład:

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

Wyjście:

Program pomyślnie wykonany

Różnice w strumieniu znaków i strumieniu bajtów

Aspekt Strumień postaci Strumień bajtów
Obsługiwany typ danych 16-bitowe znaki Unicode (tekst) 8-bitowe surowe dane (binarne)
Zajęcia kończą się Czytelnik / Pisarz Strumień wejściowy / Strumień wyjściowy
Nadaje się do Pliki tekstowe Dane Unicode Obrazy audio-wideo, pliki binarne
Konwersja Automatycznie konwertuje bajty na znaki Żadna konwersja nie działa w przypadku surowych bajtów
Przykłady FileReader FileWriter Strumień pliku wejściowego Strumień pliku wyjściowego

Powiązany artykuł

  • Java IO — wejście/wyjście w Javie z przykładami