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;reader də 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