CodeGym /Kurslar /Java SELF AZ /Verilənlərin daxil edilməsi üçün axınlar

Verilənlərin daxil edilməsi üçün axınlar

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

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: InputStreamOutputStream.

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: ReaderWriter. 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
InputStream
Reader
Məlumat Yazma
OutputStream
Writer

Praktiki Tətbiq

InputStream, OutputStream, ReaderWriter 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
int read()
Axından bir bayt oxuyur
int read(byte[] buffer)
Axından baytlar massivini oxuyur
byte[] readAllBytes()
Axından bütün baytları oxuyur
long skip(long n)
Axında n sayı qədər baytı ötürür (oxuyur və atır)
int available()
Axında qalan baytların sayını yoxlayır
void close()
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
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStream fayldan oxumaq üçün istifadə olunur
OutputStream fayla yazmaq üçün

Bufer, 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
int read()
Axından bir char oxuyur
int read(char[] buffer)
Axından bir char array-i oxuyur
long skip(long n)
Axında n sayda char keçir (oxuyur və atır)
boolean ready()
Axında hələ nəyinsə qalıb-qalmadığını yoxlayır
void close()
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
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 64Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Reader fayldan oxumaq üçün
Writer fayla yazmaq üçün

Mə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

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