— Salom, Amigo! Hozir men senga ikki interfeys – InputStream va OutputStream haqida gapirib beraman. Ular abstrakt sinf sifatida e'lon qilingan, lekin agar tushunishni boshlasang, aslida bu interfeyslar ekanligini ko‘rish mumkin. Deyarli barcha metodlari abstrakt, ba'zi ahamiyatsiz metodlardan tashqari. Biz ko'rib chiqqan "qo'riqchi"ga juda o'xshash.
Bu juda qiziqarli interfeyslar. Hozircha men ularni maxsus interfeyslar deb atayman, shunda ular nima uchun kerakligini tushunasan. Keyin esa, nima uchun ularni baribir abstrakt sinf qilganlarini gaplashamiz.
— Yaxshi. Bu qanday interfeyslar?
— Hozir aytib beraman.
Java-da qiziqarli narsa bor, u «oqim» deb ataladi. Oqim juda oddiy narsa. Uning soddaligi juda kuchli ma'lumot almashinuvi mexanizmini kafolatlaydi. Oqimlar ikki xil bo'ladi: o‘qish oqimi va yozish oqimi.
Yozish oqimiga, ehtimol allaqachon taxmin qilding, ma'lumotlarni yozish mumkin. Buning uchun unda write() metodi mavjud. O‘qish oqimidan ma'lumotlarni o‘qish mumkin. Buning uchun unda read() metodi mavjud.
InputStream – bu o‘qish oqimi interfeysi, bu qobiliyatni tavsiflaydi: «mendan baytlarni o'qish mumkin».
Va OutputStream esa mos ravishda yozish oqimi interfeysi, bu qobiliyatni tavsiflaydi: «menga baytlarni yozish mumkin».
— Va bu hammasimi?
— Aslida, ha. Lekin gap shundaki, Java-da InputStream va OutputStream interfeyslari bilan ishlashni biladigan ko'plab sinflar mavjud. Masalan, diskdan faylni o‘qib, uning tarkibini ekranga chiqarishni xohlaysanmi. Bundan osoni yo'q.
Diskdan faylni o'qish uchun InputStream interfeysini amalga oshiradigan maxsus FileInputStream sinfi mavjud. O'qilgan ma'lumotlarni boshqa faylga yozishni xohlaysanmi? Buning uchun OutputStream interfeysini amalga oshiradigan FileOutputStream sinfi mavjud. Mana bir faylni boshqa faylga nusxalash kodi qanday ko'rinishda bo'ladi.
public static void main(String[] args) throws IOException
{
InputStream inStream = new FileInputStream("c:/source.txt");
OutputStream outStream = new FileOutputStream("c:/result.txt");
while (inStream.available() > 0)
{
int data = inStream.read(); //o'qish oqimidan bitta baytni o'qish
outStream.write(data); //o'qilgan baytni boshqa oqimga yozish
}
inStream.close(); //oqimlarni yopish
outStream.close();
}
Tasavvur qilaylik, biz sinfni yozdik va unga InputStream va OutputStream qobiliyatlarini qo'shdik.
Agar biz ushbu interfeyslarni qo'llab-quvvatlashni to'g'ri amalga oshirgan bo'lsak, bizning sinfimizning obyektlarini endi diskdagi faylda saqlash mumkin. Ularning tarkibini read metodi orqali o‘qib olish kerak. Yoki fayldan yuklab olish, obyektni yaratib, fayl tarkibini write metodi orqali unga yozish mumkin.
— Misol keltirish mumkinmi?
— Mimikribon.
| Kod | Tavsif |
|---|---|
|
Soddalashtirish uchun, sinfimizda bitta obyekt – Integer tipidagi ArrayList bor deb tasavvur qilamiz. Ro'yxatni sinov ma'lumotlari bilan to'ldiramiz. |
Endi unga read va write metodlarini qo'shamiz
| Kod | Tavsif |
|---|---|
|
Endi bizning sinfimizda barcha list tarkibini ketma-ket o'qib olish imkonini beradigan read metodi amalga oshirilgan. Va list ga qiymatlarni yozish imkonini beradigan write metodi mavjud. |
Bu, albatta, InputStream va OutputStream interfeyslarining amalga oshirilishi emas, lekin juda o'xshash.
— Ha, tushunarli. Lekin qanday qilib bunday obyektning tarkibini faylda saqlash mumkin?
— Senga misol yozib qo'yaman:
public static void main(String[] args) throws IOException
{
MyClass myObject = new MyClass();
OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");
while (myObject.available() > 0)
{
int data = myObject.read(); //o'qish oqimidan bitta int o'qish
outStream.write(data); //o'qilgan int ni boshqa oqimga yozish
}
outStream.close();
}
public static void main(String[] args) throws IOException
{
InputStream inStream = new FileInputStream("c:/my-object-data.txt");
MyClass myObject = new MyClass();
while (inStream.available() > 0)
{
int data = inStream.read(); //o'qish oqimidan bitta int o'qish
myObject.write(data); //o'qilgan int ni boshqa oqimga yozish
}
inStream.close(); //oqimlarni yopish
}
— Oho! Haqiqatan ham, InputStream/OutputStream bilan ishlashga juda o'xshaydi. Oqimlar – bu ajoyib narsa!
— Ha, albatta!
GO TO FULL VERSION