CodeGym /Kurslar /Java SELF AZ /Çıxış axınları

Çıxış axınları

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

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
void write(int b)
Bir baytı (int deyil) axına yazır.
void write(byte[] buffer)
Bayt massivini axına yazır
void write(byte[] buffer, off, len)
Bayt massivinin bir hissəsini axına yazır
void flush()
Buferdə saxlanılan bütün dataları axına yazır
void close()
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
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
OutputStream fayla yazmaq üçün

Dataları 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
void write(int b)
Axına bir simvol (int deyil) yazır.
void write(char[] buffer)
Simvollar massivini axına yazır
void write(char[] buffer, off, len)
Simvollar massivinin hissəsini axına yazır
void write(String str)
Sətiri axına yazır
void write(String str, off, len)
Sətirin bir hissəsini axına yazır
void flush()
Buferdə saxlanılan bütün məlumatları axının içinə yazır
void close()
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
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]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



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

Yazı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
StringWriter writer = new StringWriter();
writer.write("Salam");
writer.write(String.valueOf(123));

String result = writer.toString();
Məqsəd simvol axını StringWriter yaradılır
Sətir StringWriter daxilindəki buferə yazılır
Sətir StringWriter daxilindəki buferə yazılır

Obyektin 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:

PrintStream Sinfi

Ə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öz metodlarına malikdir. Bunlardan ən maraqlı olanlar:

Metodlar İzahat
void print(obj)
Göstərilən obyektin sətirə çevrilməsi və hədəf axına yazılması.
void println(obj)
Göstərilən obyektin sətirə çevrilməsi və hədəf axına yazılması. Sonda yeni sətir simvolu əlavə edir.
void println()
Hədəf axına yeni sətir simvolu yazır.
PrintStream format(String format, args...)
Ş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()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ışı
PrintStream stream = System.out;
stream.println("Salam!");
Salam!

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
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Salam");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
Yaddaşda yazmaq üçün bufer yaratdıq

Buferi PrintStream obyektinə bürüdük

Məlumatları konsol kimi yazır



Massivi sətirə çeviririk!

Ekran çıxışı:
Salam!
123

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