1. OutputStream
sinfi
Daxil axınları ilə artıq tanış olduq. İndi isə çıxış axınları barədə danışmaq vaxtıdır.
OutputStream
sinfi, baytlı çıxışı dəstəkləyən bütün siniflərin ana sinfidir. Bu abstrakt sinifdir və özü heç bir şey etmir: bunun üçün hər vəziyyətə uyğun mirasçı sinifləri var.
Çətin səslənir. Daha sadə desək, bu sinif baytlarla işləyir, məsələn, simvollar və ya digər data tipləri ilə yox. Onun abstrakt olduğuna görə, adətən onu yox, onun mirasçı siniflərindən birini istifadə edirik. Məsələn, FileOutputStream
və ona bənzər siniflər.
Amma qayıdaq OutputStream
sinfinə. Bu sinfin bütün mirasçı siniflərinin reallaşdırmalı olduğu metodları var. Onların əsasları:
Metodlar | Təsvir |
---|---|
|
Bir baytı (int deyil) axına yazır. |
|
Bayt massivini axına yazır |
|
Bayt massivinin bir hissəsini axına yazır |
|
Buferdə saxlanılan bütün dataları axına yazır |
|
Axını bağlayır |
Mirasçı sinif InputStream
-in obyektini yaradarkən adətən InputStream
-in data oxuduğu mənbə obyektini göstərmək lazımdır. Mirasçı sinif OutputStream
-in obyektini yaradarkən isə adətən dataların yazıldığı hədəf obyekt və ya axın göstərilir.
Qısaca OutputStream
sinfinin bütün metodları haqqında:
write(int b)
metodu
Bu metod çıxış axınına bir bayt (int deyil) yazır. Keçirilən dəyər bayt tipinə gətirilir, ilk üç bayt atılır.
write(byte[] buffer)
metodu
Keçirilən bayt massivini çıxış axınına yazır. Vəssalam.
write(byte[] buffer, int offset, int length)
metodu
Keçirilən bayt massivinin bir hissəsini çıxış axınına yazır. offset dəyişəni massivdəki ilk elementin nömrəsini göstərir, length
isə yazılacaq fraqmentin uzunluğunu göstərir.
flush()
metodu
flush()
metodu, cari axında keşlənə biləcək dataları hədəf axına məcburi yazmaq üçün istifadə olunur. Bu metod buferizə və ya bir neçə axın obyektindən istifadə zamanı aktualdır.
close()
metodu
Axını bağlayır və bu axınla əlaqəli olan bütün sistem resurslarını azad edir. Siz try-with-resources
istifadə etdiyiniz halda close()
metodunu çağırmaya bilərsiniz.
Nümunə — faylın surətinin çıxarılması
Kod | Şərh |
---|---|
|
InputStream fayldan oxumaq üçünOutputStream fayla yazmaq üçünDataları oxuyacağımız bufer Axında data olduğu müddətdə Dataları buferə oxuyuruq Dataları buferdən ikinci axına yazırıq |
2. Writer
sinfi
Writer
sinfi OutputStream
sinfinin tam analoqudur, lakin bir fərqlə: o, bayt əvəzinə char
simvolları ilə işləyir.
Bu abstrakt sinifdir: Writer
sinfinin obyektini yaratmaq olmaz. Onun əsas məqsədi yüzlərlə irsi sinif üçün ümumi metodları təyin edən vahid valideyn sinif olmaqdır.
Writer
sinfinin (və onun irsi siniflərinin hamısının) metodları:
Metodlar | Təsvir |
---|---|
|
Axına bir simvol (int deyil) yazır. |
|
Simvollar massivini axına yazır |
|
Simvollar massivinin hissəsini axına yazır |
|
Sətiri axına yazır |
|
Sətirin bir hissəsini axına yazır |
|
Buferdə saxlanılan bütün məlumatları axının içinə yazır |
|
Axını bağlayır |
Bu metodlar OutputStream
sinfinin metodlarına çox bənzəyir, lakin baytlarla deyil, simvollarla işləyir.
Metodların qısa təsviri:
write(int b)
metodu
Bu metod axına bir char
simvolunu (int deyil) yazır. Ötürülən dəyər char
tipinə çevrilir, ilk iki bayt atılır.
write(char[] buffer)
metodu
Ötürülən simvollar massivini axına yazır.
write(char[] buffer, int offset, int length)
metodu
Ötürülən simvollar massivinin hissəsini axına yazır. offset
dəyişəni massivdəki ilk elementin nömrəsini, length
isə yazılacaq hissənin uzunluğunu təyin edir.
write(String str)
metodu
Axına ötürülən sətiri yazır.
write(String str, int offset, int length)
metodu
Axına ötürülən sətirin bir hissəsini yazır: sətir simvollar massivinə çevrilir. offset
dəyişəni massivdəki ilk elementin nömrəsini, length
isə yazılacaq hissənin uzunluğunu təyin edir.
flush()
metodu
flush()
metodu mövcud axında saxlanılan məlumatları məcburi olaraq hədəf axına yazmaq üçün istifadə olunur. Bu, buferləşdirmə və/və ya bir neçə axın obyektinin zəncirlə təşkil olunduğu hallarda aktualdır.
close()
metodu
Axını bağlayır və bu axınla əlaqəli bütün sistem resurslarını azad edir. Əgər try-with-resources
istifadə edirsinizsə, close()
metodunu çağırmaq lazım deyil.
Mətn faylını kopyalayan proqramın nümunəsi:
Kod | Qeyd |
---|---|
|
Reader fayldan oxumaq üçünWriter fayla yazmaq üçünYazılacaq məlumatlar üçün bufer Axın daxilində məlumat olduğu müddətdə Məlumatları buferə oxuyuruq Buferdən digər axına məlumatları yazırıq |
StringWriter
sinfi
Writer
sinfinin digər maraqlı irsi sinfi - StringWriter
. Burada dəyişkən bir sətir StringBuffer
obyekti kimi saxlanılır. Siz StringWriter
obyektinə bir şey "yazdığınız" zaman, sadəcə olaraq mətn daxili buferdə əlavə edilir.
Nümunə:
Kod | Qeyd |
---|---|
|
Məqsəd simvol axını StringWriter yaradılırSətir StringWriter daxilindəki buferə yazılırSətir StringWriter daxilindəki buferə yazılırObyektin məzmununu sətirə çeviririk |
Bu halda StringWriter
sinfi əslində StringBuffer
üzərində bir obertkadır, lakin StringWriter
bir axın sinfi olan Writer
sinfinin irsi sinfidir və axın obyektlərindən ibarət zəncirlərdə istifadə edilə bilər. Təcrübədə olduqca faydalı xüsusiyyətdir.
3. PrintStream
Sinfi
Çıxış axınlarını da ara axınlardan istifadə edərək zəncir şəklində təşkil etmək olur. Bu ara axınlar verilənləri özlərinə ötürülən hədəf axına yazırlar. Bu axınların qarşılıqlı təsiri ümumi olaraq belə görünür:
Ən maraqlı və çoxfunksiyalı ara çıxış axını — PrintStream
. Onun onlərlə metodu və hətta düz 12 konstrukturu var.
PrintStream
sinfi FilterOutputStream
sinifindən miras alıb, o isə OutputStream
sinifindən miras alıb. O səbəbdən PrintStream
sinfi valideyn siniflərinin bütün metodlarına və öz metodlarına malikdir. Bunlardan ən maraqlı olanlar:
Metodlar | İzahat |
---|---|
|
Göstərilən obyektin sətirə çevrilməsi və hədəf axına yazılması. |
|
Göstərilən obyektin sətirə çevrilməsi və hədəf axına yazılması. Sonda yeni sətir simvolu əlavə edir. |
|
Hədəf axına yeni sətir simvolu yazır. |
|
Şablon sətiri və ötürülən arqumentlər əsasında sətir qurur və onu çıxışa verir, String.format() metoduna bənzər işləyir. |
Bəs onlərlə metod haradadır, deyəcəksiniz?
Məsələ ondadır ki, onun print()
və println()
metodlarının müxtəlif arqumentlərlə çoxlu variantları var. Onları bu cədvələ yığmaq mümkündür.
Bu metodları belə izah etməyəcəyik, çünki siz onsuz da onları yaxşı bilirsiniz. Nəyi nəzərdə tutduğumu düşünürsünüz?
System.out.println()
əmrini xatırlayırsınız? Onu iki sətirdə də yazmaq olar:
Kod | Ekran Çıxışı |
---|---|
|
|
Sevimli System.out.println()
əmrimiz — println()
metodunun out
statik dəyişənində çağırılmasıdır, hansı ki, System
sinfinə aiddir. Bu dəyişənin tipi isə PrintStream
-dir.
Artıq bir çox səviyyədə siz hər bir tapşırıqda PrintStream
sinfinin metodlarını çağırırsınız və bu haqda heç düşünmürsünüz belə!
Praktik Tətbiq
Java-da maraqlı bir sinif var — ByteArrayOutputStream
. Bu sinif OutputStream
-dən miras alır və dinamik olaraq genişlənə bilən bayt massivi təmsil edir.
ByteArrayOutputStream
obyektini və PrintStream
obyektini belə bir zəncir şəklində düzəltmək olar:
Kod | İzahat |
---|---|
|
Yaddaşda yazmaq üçün bufer yaratdıq Buferi PrintStream obyektinə bürüdükMəlumatları konsol kimi yazır Massivi sətirə çeviririk! Ekran çıxışı: |
GO TO FULL VERSION