JavaRush /Kurslar /All lectures for UZ purposes /Standart interfeyslar: InputStream, OutputStream

Standart interfeyslar: InputStream, OutputStream

All lectures for UZ purposes
Daraja, Dars
Mavjud

— 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.

Kod
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
class MyClass
{
private List<Integer> list =
 new ArrayList<>(Arrays.asList(111, 222, 333));
}
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
class MyClass
{
private List<Integer> list =
 new ArrayList<>(Arrays.asList(111, 222, 333));

public void write(int data)
{
list.add(data);
}

public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
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:

MyClass obyektini faylga yozish
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();
}
MyClass obyektini fayldan o'qish
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!

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