logo

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_bytes' title=Strumienie 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

AspektStrumień postaciStrumień bajtów
Obsługiwany typ danych16-bitowe znaki Unicode (tekst)8-bitowe surowe dane (binarne)
Zajęcia kończą sięCzytelnik / PisarzStrumień wejściowy / Strumień wyjściowy
Nadaje się doPliki tekstowe Dane UnicodeObrazy audio-wideo, pliki binarne
KonwersjaAutomatycznie konwertuje bajty na znakiŻadna konwersja nie działa w przypadku surowych bajtów
PrzykładyFileReader FileWriterStrumień pliku wejściowego Strumień pliku wyjściowego

Powiązany artykuł

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