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:

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ın – Reader 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.

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.
|
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 olduqdaBir sətir oxuyuruq Sətri ekrana çap edirik |
Ə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 |
|---|---|
|
|
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.
GO TO FULL VERSION