Chiqish oqimlari

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. OutputStream sinfi

Kirish oqimlari bilan endi tanishdik. Endi chiqish oqimlari haqida gaplashamiz.

OutputStream sinfi barcha baytli chiqishni qo'llab-quvvatlaydigan sinflar uchun ota-sinfdir. Bu hech nimani qilmaydigan abstrakt sinf: bu uchun turmush sharoitiga mos keluvchi merosxoʻr sinflari bor.

Murakkab eshitilyapti. Oddiyroq qilib aytganda, bu sinf baytlar bilan ishlaydi, masalan, belgilar yoki boshqa ma'lumot turlari bilan emas. Uning abstrakt ekanligi shuni anglatadiki, biz odatda uni emas, balki merosxoʻr sinflaridan birini ishlatamiz. Masalan, FileOutputStream va unga oʻxshashlar.

Ammo OutputStream sinfiga qaytamiz. Bu sinfning barcha merosxoʻr sinflari amalga oshirishi kerak bo'lgan metodlari bor. Mana asosiylari:

Metodlar Tavsif
void write(int b)
Bir baytni (int emas) oqimga yozadi.
void write(byte[] buffer)
Baytlar massivini oqimga yozadi
void write(byte[] buffer, off, len)
Baytlar massivining bo'laklarini oqimga yozadi
void flush()
Buferda saqlangan barcha ma'lumotlarni oqimga yozadi
void close()
Oqimni yopadi

InputStream merosxoʻr sinfidan obyekt yaratishda odatda InputStream ma'lumotlarni o'qiydigan manba-obyektni ko'rsatadi. OutputStream merosxoʻr sinfidan obyekt yaratishda ham odatda ma'lumotlarni yozadigan maqsad-obyekt yoki maqsadli oqimni ko'rsatadi.

Qisqa qilib, OutputStream sinfining barcha metodlarini ko'rib chiqamiz:

write(int b) metodi

Bu metod chiqish oqimiga bir baytni (int emas) yozadi. Uzatilgan qiymat bayt turiga o'tkaziladi, uchta bosh bayt tashlab yuboriladi.

write(byte[] buffer) metodi

Chiqish oqimiga berilgan baytlar massivini yozadi. Boshqa hech narsa.

write(byte[] buffer, int offset, int length) metodi

Chiqish oqimiga berilgan baytlar massivining bir qismini yozadi. offset o'zgaruvchisi massivning birinchi elementining raqamini belgilaydi, length — yozilayotgan fragmentning uzunligi.

flush() metodi

flush() metodi manzil oqimiga keshlangan ma'lumotlarni majburiy yozish uchun ishlatiladi. Bu buferlashni va/yoki obyekt oqimlarini zanjirda ishlatishda dolzarbdir.

close() metodi

Maqsadli objеktga barcha yozilmagan ma'lumotlarni yozadi. Agar siz try-with-resources ishlatayotgan bo'lsangiz, close() metodini chaqirmasangiz ham bo'ladi.

Misol — faylni nusxalash:

Kod Izoh
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 o'qish uchun
OutputStream faylga yozish uchun

Biz ma'lumotlarni o'qiydigan bufer
Oqimda ma'lumotlar bor ekan

Ma'lumotlarni buferga o'qib olamiz
Ma'lumotlarni birinchi oqimdan ikkinchi oqimga yozamiz

2. Writer sinfi

Writer sinfi OutputStream sinfining to'liq ekvivalenti, faqat bitta farqi bilan: u baytlar o'rniga belgilar, char, bilan ishlaydi.

Bu abstrakt sinf: Writer sinfining ob'ektini yaratib bo'lmaydi. Uning asosiy maqsadi - yuzlab merosxoʻr sinflar uchun yagona ota-sinf bo'lish va ular uchun belgilar oqimlari bilan ishlash uchun umumiy metodlar belgilashdir.

Writer sinfining metodlari (va uning barcha merosxoʻr sinflari):

Metodlar Tavsif
void write(int b)
Bir belgi (int emas) oqimga yozadi.
void write(char[] buffer)
Belgilar massivini oqimga yozadi
void write(char[] buffer, off, len)
Belgilar massivining bir qismini oqimga yozadi
void write(String str)
Qatorni oqimga yozadi
void write(String str, off, len)
Qatorning bir qismini oqimga yozadi
void flush()
Buferda saqlangan barcha ma'lumotlarni oqimga yozadi
void close()
Oqimni yopadi

Metodlar OutputStream sinfining metodlariga juda o'xshaydi, faqat baytlar o'rniga belgilar bilan ishlaydi.

Metodlarning qisqacha tavsifi:

write(int b) metodi

Bu metod chiqish oqimiga bir belgi char (int emas) yozadi. Uzatilgan qiymat char turiga o'tkaziladi, ikkita bosh bayt tashlab yuboriladi.

write(char[] buffer) metodi

Chiqish oqimiga berilgan belgilar massivini yozadi.

write(char[] buffer, int offset, int length) metodi

Chiqish oqimiga berilgan belgilar massivining bir qismini yozadi. offset o'zgaruvchisi massivning birinchi elementining raqamini belgilaydi, length — yozilayotgan fragmentning uzunligi.

write(String str) metodi

Chiqish oqimiga berilgan qatorni yozadi.

write(String str, int offset, int length) metodi

Chiqish oqimiga berilgan qatorning bir qismini yozadi: qator belgilar massiviga aylantiriladi. offset o'zgaruvchisi massivning birinchi elementining raqamini belgilaydi, length — yozilayotgan fragmentning uzunligi.

flush() metodi

flush() metodi maqsadli oqimga keshlangan ma'lumotlarni majburiy yozish uchun ishlatiladi. Bu buferlashni va/yoki obyekt oqimlarini zanjirda ishlatishda dolzarbdir.

close() metodi

Maqsadli objеktga barcha yozilmagan ma'lumotlarni yozadi. Agar siz try-with-resources ishlatayotgan bo'lsangiz, close() metodini chaqirmasangiz ham bo'ladi.

Matnli faylni nusxalash dasturi misoli:

Kod Izoh
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 o'qish uchun
Writer faylga yozish uchun

Biz ma'lumotlarni o'qiydigan bufer
Oqimda ma'lumotlar bor ekan

Ma'lumotlarni buferga o'qib olamiz
Ma'lumotlarni birinchi oqimdan ikkinchi oqimga yozamiz

StringWriter sinfi

Writer sinfining yana bir qiziqarli merosxoʻri StringWriter hisoblanadi. Unda o‘zgaruvchan qator — StringBuffer obyekti mavjud. Har safar siz StringWriter obyektiga nimadir “yozsangiz”, matn ichki buferga qo‘shiladi.

Misol:

Kod Izoh
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
Maqsadli belgilar oqimi StringWriter yaratilyapti
Matn StringWriter ichidagi buferga yozilyapti
Matn StringWriter ichidagi buferga yozilyapti

Obyektning mazmunini qator holatiga o'zgartiryapmiz

Bu holatda StringWriter sinfi aslida StringBuffer sinfiga obertka, lekin StringWriter sinfi Writer oqimining merosxoʻri va u oqimlar obyektlari zanjirlarida ishlatilishi mumkin. Bu amaliyotda juda foydali xususiyat.



Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION