Символен поток срещу байтов поток в Java

Символен поток срещу байтов поток в Java

Потокът е непрекъснат поток от данни. В Java I/O потоците се използват за четене от входни източници или запис в изходни дестинации, като например файлове. Те предоставят начин за последователен достъп до данните. Пакетът java.io включва класове за обработка както на потоци от байтове, така и на потоци от символи, както и за конвертиране между тях.

  • Входящ поток: чете данни от източника. 
  • Изходен поток: записва данни към дестинация. 

Кога да използвате символен поток над байтов поток:

В Java символите се съхраняват с помощта на конвенциите на Unicode. Потокът от символи е полезен, когато искаме да обработваме текстови файлове. Тези текстови файлове могат да се обработват символ по символ. Размерът на символа обикновено е 16 бита.

Кога да използвате байтов поток над символен поток:

Байт ориентирано чете байт по байт. Поток от байтове е подходящ за обработка на необработени данни като двоични файлове.

Ключови моменти при използване и работа с някой от горните потоци:

  • Класовете на символния поток обикновено завършват с Reader/Writer, докато класовете на байтовия поток завършват с InputStream/OutputStream.
  • Примерните кодове в тази статия използват небуферирани потоци, които са по-малко ефективни. За по-добра производителност обикновено ги обвиваме с BufferedReader/BufferedWriter (потоци от знаци) или BufferedInputStream/BufferedOutputStream (потоци от байтове).
  • Винаги затваряйте потоците след употреба, за да освободите ресурси и да предотвратите грешки.
  • Горните кодове може да не се изпълняват в онлайн компилатори, тъй като файловете може да не съществуват.

Поток от знаци

В Java символите се съхраняват с помощта на конвенциите на Unicode. Потокът от знаци автоматично ни позволява да четем/записваме данни символ по знак. Например FileReader и FileWriter са потоци от символи, използвани за четене от източника и запис до дестинацията.

не_уникод_байтовеПотоци от символи

Пример

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

Изход:

Записва съдържание в целевия файл символ по символ

Програмата е изпълнена успешно

Байтов поток

Байтовият поток в Java е поток, който обработва вход и изход на необработени 8-битови двоични данни. Използва се главно за четене и писане на нетекстови данни като изображения, аудио, видео или всеки двоичен файл. например FileInputStream се използва за четене от източника и FileOutputStream за запис в дестинацията.

Пример:

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

Изход:

Програмата е изпълнена успешно

Разлики в поток от символи срещу поток от байтове

Аспект Поток от знаци Байтов поток
Обработен тип данни 16-битови Unicode знаци (текст) 8-битови необработени данни (двоични)
Занятията завършват с Читател / Писател InputStream / OutputStream
Подходящ за Текстови файлове Unicode данни Изображения аудио видео двоични файлове
Преобразуване Автоматично преобразува байтове в знаци Никое преобразуване не работи с необработени байтове
Примери FileReader FileWriter FileInputStream FileOutputStream

Свързана статия

  • Java IO - Вход/Изход в Java с примери