1. Veri Axınları
Hər hansı bir proqram nadir hallarda təkbaşına mövcuddur. Adətən o, "xarici dünya" ilə qarşılıqlı fəaliyyət göstərir. Bu klaviaturadan məlumat oxumaq, mesaj göndərmək, internetdən səhifələri yükləmək və ya əksinə faylları uzaq serverə yükləmək ola bilər.
Bütün bu şeylərə bir sözlə deyə bilərik — məlumat mübadiləsi prosesi proqram ilə xarici dünya arasında. Baxmayaraq ki, bu artıq bir söz deyil.
Məlumat mübadiləsi prosesini iki növə bölmək olar: məlumatın alınması və məlumatın göndərilməsi. Məsələn, Scanner
obyektindən istifadə edərək klaviaturadan məlumat oxuyursunuz — bu məlumatın alınmasıdır. Və System.out.println()
əmri ilə məlumatı ekrana çıxarırsınız — bu məlumatın göndərilməsidir.
Proqramlaşdırmada məlumat mübadiləsi prosesini təsvir etmək üçün axın termini istifadə olunur. Axı belə bir ad haradan gəlib?
Real həyatda bu, su axını və ya insan axını (insan kütləsi) ola bilər. Proqramlaşdırmada axın dedikdə veri axını nəzərdə tutulur.
Axınlar — universal bir alətdir. Onlar proqrama haradan istəsəniz məlumat almağa imkan verir (gələn axınlar) və məlumatı hara istəyirsiniz göndərməyə imkan verir (gedən axınlar). İki növə bölünürlər:
- Gələn axın (Input): məlumat almaq üçün istifadə olunur
- Gedən axın (Output): məlumat göndərmək üçün istifadə olunur
Axınları "əllə toxunula bilən" etmək üçün, Java tərtibatçıları iki sinif yazdılar: InputStream
və OutputStream
.
InputStream
sinifinin məlumat oxumağa imkan verən read()
metodu var. OutputStream
sinifinin isə məlumat yazmağa imkan verən write()
metodu var. Onların digər metodları da var, lakin bu barədə sonra.
Bayt Axınları
Məlumatlar nədir və onları hansı formada oxumaq olar? Başqa sözlə, bu siniflər hansı məlumat tiplərini dəstəkləyir?
Oh, bunlar universal siniflərdir, ona görə də ən çox yayılan məlumat tiplərini dəstəkləyirlər — byte
. OutputStream
obyektinə baytlar (və bayt massivləri) yaza bilərsiniz, və InputStream
obyektindən də baytlar (və ya bayt massivləri) oxuya bilərsiniz. Bunların heç bir başqa məlumat tipini dəstəkləmədiyini qeyd etmək vacibdir.
Buna görə də belə axınlar bayt axınları adlandırılır.
Axınların xüsusiyyəti budur ki, məlumatları onlardan yalnız ardıcıl şəkildə oxumaq (yazmaq) mümkündür. Siz axının ortasından məlumat oxuya bilməzsiniz, ondan əvvəlki məlumatları oxumadan.
Klaviaturadan oxumaq Scanner
sinifi vasitəsilə məhz belə işləyir: siz məlumatları ardıcıl olaraq klaviaturadan oxuyursunuz: sətir-sətir. Bir sətiri oxudunuz, növbəti sətiri oxudunuz, sonra növbəti sətiri və s. Buna görə də sətir oxuma metodu nextLine()
adlanır (sözbəsöz — "növbəti sətir").
OutputStream
axınına məlumat yazmaq da ardıcıl şəkildə baş verir. Yaxşı bir nümunə — ekrana məlumat çıxarmaqdır. Siz bir sətir çıxarırsınız, sonra başqa birini və daha birini. Bu ardıcıl bir çıxışdır. Siz 1-ci sətri, sonra 10-cu sətri və sonra 2-ci sətri çıxara bilməzsiniz. Bütün məlumatlar çıxış axınına yalnız ardıcıl olaraq yazılır.
Simvol Axınları
Yaxınlarda öyrəndiniz ki, sətirlər ən populyar ikinci məlumat tipidir və bu həqiqətən də belədir. Çoxlu məlumat simvollar və tam sətirlər şəklində ötürülür. Kompüter hər şeyi bayt şəklində ötürərdi, amma insanlar bu qədər mükəmməl deyil.
Java proqramçıları bu faktı nəzərə alıblar və iki əlavə sinif yazıblar: Reader
və Writer
. Reader
sinifi — InputStream
sinifinin analoqudur, yalnız onun read()
metodu baytlar deyil, simvollar — char
oxuyur. Writer
sinifi OutputStream
sinifinə uyğundur və Reader
sinifi kimi simvollarla (char
) işləyir, amma baytlarla yox.
Bu dörd sinifi müqayisə etsəniz, belə bir şəkil alarıq:
Baytlar (byte) | Simvollar (char) | |
---|---|---|
Məlumat Oxuma | |
|
Məlumat Yazma | |
|
Praktiki Tətbiq
InputStream
, OutputStream
, Reader
və Writer
sinifləri açıq şəkildə heç kim tərəfindən istifadə edilmir: onlar məlumatları oxuya biləcəyiniz heç bir xarici obyektə (və ya məlumat yaza biləcəyiniz obyektə) birləşdirilməyiblər. Bununla belə, bu dörd sinifin çoxlu mirasçı sinifləri var ki, onlar çox şeyi bacarırlar.
2. InputStream
sinfi
InputStream
sinfi yüzlərlə törəmə sinif üçün əsas sinfdir. Özündə heç bir məlumat saxlamır, amma onun elə üsulları var ki, həmin üsullar hamı tərəfindən istifadə olunur.
Axın obyektləri adətən məlumat saxlamır. Axın - məlumat oxumaq/yazmaq alətidir, amma onu saxlamağa görə məsuliyyət daşımır. Hərçənd istisnalar mövcuddur.
InputStream
sinfinin və onun bütün törəmə siniflərinin metodları:
Metodlar | Təsvir |
---|---|
|
Axından bir bayt oxuyur |
|
Axından baytlar massivini oxuyur |
|
Axından bütün baytları oxuyur |
|
Axında n sayı qədər baytı ötürür (oxuyur və atır) |
|
Axında qalan baytların sayını yoxlayır |
|
Axını bağlayır |
Bu metodları qısaca nəzərdən keçirək:
read()
metodu
read()
metodu axından bir bayt oxuyaraq onu geri qaytarır. int
nəticə tipi sizi çaşdırmasın, bu standart bir növdür. int
tipinin ilk üç baytı sıfır olacaq.
read(byte[] buffer)
metodu
Bu, read()
metodunun ikinci dəyişməsidir. O, birbaşa InputStream
sinifindən baytlar massivi oxumağa imkan verir. Baytların saxlanması üçün massiv parametri ötürülməlidir. Metod oxunan real baytların sayını qaytarır.
Məsələn, 10 kilobaytlıq bir bufferiniz var və FileInputStream
sinfi ilə məlumat oxuyursunuz. Əgər fayl yalnız 2 kilobaytdırsa, bütün məlumat buffer massivinə yerləşdiriləcək və metod 2048 (2 kilobayt) qaytaracaq.
readAllBytes()
metodu
Çox faydalı bir metoddur. Sadəcə InputStream
'dən bütün məlumatları oxuyub, bütün baytları bir massiv kimi qaytarır. Kiçik fayllar üçün çox rahatdır. Amma böyük fayllar yaddaşa yerləşməyə bilər və nəticədə metod istisna atar.
skip(long n)
metodu
Bu metod, InputStream
obyektindən ilk n
baytı ötürməyə imkan verir. Məlumatlar ardıcıl şəkildə oxunduğundan, metod sadəcə ilk n
baytı oxuyub onları atır.
Axının əvvəl bitməsi vəziyyətində əsasda n
-dən az bayt ötürülə bilər və bu qaytarılır.
int available()
metodu
Metod axında nə qədər bayt qaldığını qaytarır
void close()
metodu
close()
metodu məlumat axınını bağlayır və onunla bağlı xarici resursları sərbəst buraxır. Axın bağlandıqdan sonra məlumat oxumaq mümkün deyil.
Gəlin böyük faylın surətini çıxarmaq üçün bir proqram nümunəsi yazaq. Bu faylı readAllBytes()
metodu ilə tamamilə yaddaşa oxuya bilmərik. Nümunə:
Kod | Qeyd |
---|---|
|
InputStream fayldan oxumaq üçün istifadə olunurOutputStream fayla yazmaq üçünBufer, məlumatları saxlayacağımız yer Axında məlumat olduğu müddətcə Məlumatı buferə oxuyuruq Məlumatı buferdən digər axına yazırıq |
Bu nümunədə iki sinif istifadə etdik: FileInputStream
— fayldan məlumat oxumaq üçün InputStream
-dən törəmiş bir sinifdir, və FileOutputStream
— fayla məlumat yazmaq üçün OutputStream
-dən törəmiş bir sinifdir. İkinci sinif haqqında bir az sonra danışacağıq.
Başqa bir maraqlı məqam — bu real
dəyişəni. Fayldan sonuncu məlumat bloku oxunarkən, onun uzunluğunun 64Kb-dan az olması ehtimalı yüksəkdir. Buna görə də, output
-a yalnız real
baytları yazmaq lazımdır. Bu da write()
metodunda həyata keçirilir.
3. Reader
sinfi
Reader
sinfi — tamamilə InputStream
sinfinin analoqudur, yalnız bir fərqlə: o, baytlarla yox, simvollarla — char
işləyir. Reader
sinfi, eynilə InputStream
sinfi kimi müstəqil olaraq heç yerdə istifadə olunmur: o, yüzlərlə törəmə siniflər üçün ana sinif kimi işləyir və onların hamısı üçün ümumi metodları təyin edir.
Reader
sinfinin (və bütün törəmə siniflərinin) metodları:
Metodlar | Təsvir |
---|---|
|
Axından bir char oxuyur |
|
Axından bir char array-i oxuyur |
|
Axında n sayda char keçir (oxuyur və atır) |
|
Axında hələ nəyinsə qalıb-qalmadığını yoxlayır |
|
Axını bağlayır |
Metodlar InputStream
sinfinin metodlarına çox oxşayır, baxmayaraq ki, kiçik fərqlər var.
int read()
metodu
Bu metod axından bir char
oxuyur və onu qaytarır. char
tipi int
tipinə genişlənir, amma nəticənin ilk iki baytı həmişə sıfır olur.
int read(char[] buffer)
metodu
Bu metodun read()
-in ikinci modifikasiyasıdır. O, Reader
-dan dərhal bir simvol array-i oxumağa imkan verir. Simvol array-i metodun parametrinə ötürülməlidir. Metod bir rəqəm — realda oxunan simvolların sayını qaytarır.
skip(long n)
metodu
Bu metod Reader
obyektində ilk n
simvolu keçməyə imkan verir. InputStream
sinfinin ekvivalent metoduna tam bənzər şəkildə işləyir. Real keçilən simvolların sayını qaytarır.
boolean ready()
metodu
Axında hələ oxunmamış baytların olub-olmadığını göstərmək üçün true
qaytarır.
void close()
metodu
close()
metodu məlumat axınını bağlayır və onunla əlaqəli olan xarici resursları azad edir. Axını bağladıqdan sonra ondan məlumat oxumaq mümkün olmaz.
Müqayisə üçün gəlin bir mətn faylını kopyalayan proqram yazaq:
Kod | Qeyd |
---|---|
|
Reader fayldan oxumaq üçünWriter fayla yazmaq üçünMəlumatları oxuyacağımız bufer Axında məlumat olduğu müddətdə Məlumatı buferə oxuyuruq Buferdən məlumatı ikinci axına yazırıq |
GO TO FULL VERSION