Potoklar zanjiri

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. InputStreamReader klassi

Potoklarning yana bir qiziqarli xususiyati bir nechta potoklarni zanjirlash imkoniyati. Potoklar ma'lumotlarni nafaqat ma'lumot manbaidan, balki boshqa potokdan ham o'qishi mumkin.

Bu Java-da juda kuchli mexanizm bo'lib, ma'lumotlarni o'qish bo'yicha murakkab scenariylarni yaratishga imkon beradi, bir potokdan boshqasiga ulash orqali. Bu tizim taxminan shunday ko'rinadi:

Класс InputStreamReader

Dastur ma'lumotlarni potokdan o'qiganda, u o'z manbaidan: boshqa potokdan yoki fayldan, masalan, o'qiydi.

Ayni vaqtda har bir ma'lumot potoki ma'lumotlarni faqat o'qish va topshirishdan tashqari, ularni o'zgartirishi yoki ularga turli amallarni bajarishi mumkin. Bunday "oraliq potok"lar uchun yaxshi misol InputStreamReader klassidir.

Biz allaqachon FileReader deb ataladigan klassni bilamiz, va bu Reader bo'lib, ma'lumotlarni fayldan o'qiydi. InputStreamReader klassi esa qayerdan o'qiydi? To'g'ri: InputStream potogidan.

InputStreamReader turidagi obyekt yaratish uchun unga InputStream turi yoki uning merosxo'r klassidan obyekt topshirilishi kerak. Misol:

String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);

InputStreamReader klassida Reader klassida mavjud bo'lgan barcha metodlar mavjud, ularning ishlashi bir xil.

Asosiy farqi InputStreamReader va, masalan, FileReader klasslarida qayerdan ma'lumotlarni o'qishidir. FileReader ma'lumotlarni fayldan o'qiydi (shuning uchun unga FileReader deb ataladi), InputStreamReader esa InputStream potogidan ma'lumotlarni o'qiydi.

Agar siz FileReader obyekti orqali read() metodini chaqirib o'qiganingizda, u fayldan diska ikki bayt o'qib, sizga char sifatida qaytaradi.

Agar siz InputStreamReader obyekti orqali read() metodini chaqirib o'qiganingizda, u unga o'tkazilgan FileInputStream obyektidan o'qigan ikki bayt ma'lumot oladi, bu obyekt esa fayldan o'qiydi. Shunday qilib, metod read() chaqirish zanjiri hosil bo'ladi.


2. BufferedReader klassi

Yana bir qiziqarli klass mavjud — BufferedReader. Siz uni ko'p marotaba ishlatishingiz mumkin. U ham boshqa bir potokdan ma'lumotlarni o'qiydigan "oraliq potok".

BufferedReader klassi, uning nomidan ko'rinib turganidek, Reader dan meros olgan va simvollarni o'qishga imkon beradi. Ammo eng qiziqarli tomoni shundaki, unga manba sifatida simvollarni o'qiy oladigan potokni — Reader klassidan meros olgan potokni berish kerak.

Nima uchun bu kerak? InputStreamReader dan farqli o'laroq BufferedReader klassi baytlarni simvollarga aylantirmaydi: u umuman hech narsa aylantirmaydi. Buning o'rniga u ma'lumotlarni buferlaydi.

Класс BufferedReader

Dastur BufferedReader obyekti orqali bir simvolni o'qiganda, u o'z potok-manbaidan katta simvollar massivi o'qib, ularni ichida saqlaydi.

Keyingi simvolni o'qishda, BufferedReader obyekti faqat o'z ichidagi massivi-buferidan keyingi simvolni olib, qaytaradi va potok-manbaga murojaat etmaydi. Va faqat buferdagi barcha simvollar tugaganida, yana katta simvollar massivi o'qiydi.

BufferedReader klassida yana bir foydali metod mavjud — String readLine(), bu metod potok-manbadan ma'lumotlarni satrlar shaklida o'qishga imkon beradi. Ushbu metod yordamida, masalan, biror faylni o'qib, uning mazmunini ekranga satrma-satr chiqarish mumkin. Misol:

Kodni siqiq shaklda yozib chiqdik, shunda qanday qulayroq ishlash mumkinligini ko'rishingiz uchun. Buni biroz batafsilroq ham yozish mumkin.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}


FileReader obyekt yaratiladi, manba — fayl.
BufferedReader obyekt yaratiladi, manba — FileReader obyekti;
readerda hali ma'lumotlar mavjud bo'lsa

Bir qatorni o'qing
Qatorni ekranga chiqaring
Muhim nuqta:

Agar siz bir nechta potoklarni zanjirga ulasangiz, close() metodini ulardan faqat bittasiga chaqirish kifoya: u o'z manbasi potokiga va h.k. chaqiradi, to oxirgi potok ma'lumotlarni olishgacha.



3. Konsoldan o'qish

Yana bir qiziqarli fakt: Scanner klassi — System.in potokidan ma'lumotlarni o'qiydigan kiruvchi oraliq potokdir — bu ham potokdir.

Konsoldan qatorni o'qishning ikki usuli:

Scanner klassi BufferedReader va InputStreamReader klasslari
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

Bizning mashhur System.in — bu System klassining statik o'zgaruvchisi indan boshqa narsa emas. Uning turi — InputStream, va nomi — in.

Shunday qilib, JavaRushda Java-ni o'rganishni boshlaganingizdan buyon siz potoklar bilan ishlayapsiz va ular bilan zanjirlar yaratyapsiz. Faqat endi siz buni tushungan holda qilasiz.


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