CodeGym /Kurslar /Java SELF AZ /Potok zəncirləri

Potok zəncirləri

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. InputStreamReader sinfi

Stream-lərin başqa maraqlı bir xüsusiyyəti bir neçə stream-i zəncirləyə bilməsidir. Stream məlumatları yalnız məlumat mənbəyindən oxumaqla kifayətlənmir, həm də başqa bir stream-dən oxuya bilir.

Bu, Java-dakı çox güclü bir mexanizmdir, hansı ki, bir stream-i digərinə bağlamaqla mürəkkəb məlumat oxuma ssenariləri qurmağa imkan verir. Bu sxem təxmini belə görünür:

InputStreamReader sinfi

Proqram stream-dən məlumat oxuyanda, o, öz növbəsində onları öz məlumat mənbəyindən: başqa bir stream-dən və ya, məsələn, fayldan oxuyur.

Bununla yanaşı, hər bir stream təkcə oxuyub məlumatı ötürməklə kifayətlənmir, həm də onları emal edə və ya müxtəlif əməliyyatlar yerinə yetirə bilir. Belə "aralıq stream"in yaxşı bir nümunəsi InputStreamReader sinfidir.

Biz artıq fayldan məlumat oxumaq üçün istifadə olunan FileReader sinfini tanıyırıq. Bəs InputStreamReader sinfi məlumatları haradan oxuyur? Düzdür: InputStream stream-indən.

InputStreamReader tipində bir obyekt yaratmaq üçün, ona InputStream və ya onun törəmə sinfindən bir obyekt ötürmək lazımdır. Nümunə:

String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);

InputStreamReader sinfinin Reader sinfində olan bütün metodları var və onlar tam olaraq eyni şəkildə işləyir.

InputStreamReader ilə, məsələn, FileReader siniflərinin əsas fərqi onların məlumatları haradan oxumalarıdır. FileReader fayldan məlumat oxuyur (ona görə də o FileReader adlanır), InputStreamReader isə InputStream stream-indən məlumat oxuyur.

Siz FileReader obyektindən read() metodu ilə simvol oxuyanda, o fayldakı iki baytı oxuyub, sizə char kimi qaytarır.

Siz InputStreamReader obyektindən read() metodu ilə simvol oxuyanda, o öz növbəsində ona ötürülmüş FileInputStream obyektindən iki bayt məlumat oxuyur, hansı ki, öz növbəsində məlumatları fayldan oxuyur. Beləliklə, read() metodlarının çağırış zənciri yaranır.


2. BufferedReader Sinfi

Daha bir maraqlı sinif var ki, çox güman ki, onu tez-tez istifadə edəcəksiniz — BufferedReader. Bu da başqa bir axından oxuyan “aralıq” axındır.

BufferedReader sinfi, adından da göründüyü kimi, Reader sinfinin alt sinfidir və simvolları oxumağa imkan verir. Lakin ən maraqlısı budur ki, məlumat mənbəyi kimi ona da simvollar oxumağa imkan verən bir axınReader sinfinin alt sinfini ötürmək lazımdır.

Bunun mənası nədir? InputStreamReader’dən fərqli olaraq, BufferedReader sinfi baytları simvollara çevirmir: ümumiyyətlə heç nəyi çevirmir. Bunun yerinə o, məlumatları buferləşdirir.

BufferedReader Sinfi

Proqram BufferedReader obyektindən bir simvol oxuyanda, o, axın mənbəyindən dərhal böyük bir simvol massivini oxuyur. Və onları öz daxilində saxlayır.

Daha sonra, BufferedReader obyektindən növbəti simvol oxunanda, o, sadəcə daxili bufer massivindən növbəti simvolu götürür və onu verir, məlumat axını mənbəyinə müraciət etmədən. Və yalnız bütün simvollar buferdə bitdikdə, o, yenidən böyük bir simvol massivi oxuyur.

Bundan əlavə, BufferedReader sinfinin çox faydalı bir metodu var — String readLine(), hansı ki, axın mənbəyindən məlumatları birbaşa sətirlərlə oxumağa imkan verir. Bu metod vasitəsilə, məsələn, hansısa faylı oxuyub onun məzmununu ekrana sətir-sətir çap etmək olar. Nümunə:

Kodu daha rahat anlamaq üçün kompakt formatda verdik. Bununla belə, bu kodu bir az daha detallı yaza bilərsiniz.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}


FileReader obyekti yaradırıq, məlumat mənbəyi — fayldır.
BufferedReader obyekti yaradırıq, məlumat mənbəyi — FileReader obyektidir;
readerdə hələ məlumat olduqda

Bir sətir oxuyuruq
Sətri ekrana çap edirik
Vacib məqam:

Əgər bir neçə axını zəncirləmisinizsə, close() metodunu sadəcə birində çağırmaq kifayətdir: o, bunu məlumat mənbəyində və s.-də çağıracaq, axırda məlumat axınına qədər davam edəcək.



3. Konsoldan oxuma

Başqa bir maraqlı fakt: Scanner sinfi — heç də başqa bir şey deyil, bu, System.in axınından məlumatları oxuyan bir ara axındır — o da məlumat axınıdır.

Konsoldan sətri oxumaq üçün iki üsul mövcuddur:

Scanner sinfi BufferedReader və InputStreamReader sinifləri
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

Məşhur System.in — heç də başqa bir şey deyil, bu, in adlı statik dəyişənidir System sinfinin. Onun tipi — InputStream, adı isə — in.

Beləliklə, CodeGym-də Java'ya başlamazdan bəri praktiki olaraq məlumat axınları ilə işləyirsiniz və onların zəncirlərini qurursunuz. İndi isə bunu daha şüurlu şəkildə edəcəksiniz.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION