JavaRush /Java blogi /Random-UZ /Klaviaturadan o'qish - "o'quvchilar"

Klaviaturadan o'qish - "o'quvchilar"

Guruhda nashr etilgan
Salom! Ma'ruzalar va topshiriqlarda biz konsolga ma'lumotlarni chiqarishni va aksincha - klaviaturadan ma'lumotlarni o'qishni o'rgandik. Klaviaturadan o'qish - "o'quvchilar" - 1Buning uchun siz hatto murakkab qurilishdan foydalanishni o'rgandingiz:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Ammo biz hali ham bitta savolga javob bermadik.

Bu hatto qanday ishlaydi?

Aslida, har qanday dastur ko'pincha o'z-o'zidan mavjud emas. U boshqa dasturlar, tizimlar, Internet va boshqalar bilan bog'lanishi mumkin. "Muloqot" so'zi bilan biz birinchi navbatda "ma'lumotlar almashinuvi" ni tushunamiz. Ya'ni, ba'zi ma'lumotlarni tashqaridan oling va aksincha, o'z ma'lumotlaringizni biror joyga yuboring. Hatto kundalik hayotda ham dasturlar o'rtasida ma'lumotlar almashinuviga ko'plab misollar mavjud. Shunday qilib, ko'plab saytlarda ro'yxatdan o'tish o'rniga Facebook yoki Twitter hisobingizdan foydalanib tizimga kirishingiz mumkin. Bunday vaziyatda ikkita dastur, aytaylik, Twitter va siz ro'yxatdan o'tmoqchi bo'lgan sayt bir-biri bilan kerakli ma'lumotlarni almashadi, shundan so'ng siz yakuniy natijani ko'rasiz - muvaffaqiyatli avtorizatsiya. " Oqim " atamasi ko'pincha dasturlashda ma'lumotlar almashinuvi jarayonini tavsiflash uchun ishlatiladi . Bu nom qayerdan paydo bo'lgan? "Oqim" dasturlashdan ko'ra daryo yoki oqim bilan ko'proq bog'liq. Aslida, bu bejiz emas :) Oqim, aslida, harakatlanuvchi ma'lumotlar qismidir. Ya'ni, dasturlashda oqim bo'ylab "oqadigan" suv emas, balki baytlar va belgilar ko'rinishidagi ma'lumotlar. Ma'lumotlar oqimidan biz ma'lumotlarni qismlarga bo'lib olishimiz va u bilan biror narsa qilishimiz mumkin. Yana “suv oqadigan” o‘xshatishdan foydalanamiz: sho‘rva tayyorlash, o‘t o‘chirish yoki gullarni sug‘orish uchun daryodan suv olish mumkin. Oqimlardan foydalanib, siz har qanday ma'lumot manbai bilan ishlashingiz mumkin: Internet, kompyuteringizning fayl tizimi yoki boshqa narsa - bu muhim emas. Oqimlar universal vositadir. Ular dasturga istalgan joydan (kiruvchi oqimlar) ma’lumotlarni qabul qilish va istalgan joyga jo‘natish imkonini beradi (chiqish oqimlari). Ularning vazifasi bitta - ma'lumotlarni bir joyda olish va boshqa joyga yuborish. Oqimlar ikki turga bo'linadi:
  1. Kiruvchi oqim ( Kirish ) - ma'lumotlarni qabul qilish uchun ishlatiladi
  2. Chiquvchi oqim ( Chiqish ) - ma'lumotlarni yuborish uchun.
Java'da kiruvchi ma'lumotlar oqimi sinfda InputStream, chiquvchi ma'lumotlar oqimi esa sinfda amalga oshiriladi OutputStream. Ammo iplarni ajratishning yana bir usuli bor. Ular nafaqat kiruvchi va chiquvchiga, balki bayt va belgilarga ham bo'linadi . Bu erda ma'no tushuntirishsiz aniq: bayt oqimi ma'lumotni baytlar to'plami shaklida, belgilar oqimi esa belgilar to'plami shaklida uzatadi. Ushbu ma'ruzada biz kiruvchi oqimlar haqida batafsil to'xtalib o'tamiz. Va men oxirida chiquvchi havolalar haqida ma'lumot qo'shaman va siz bu haqda o'zingiz o'qishingiz mumkin :) Shunday qilib, bizning kodimiz:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Siz ma'ruzalarni o'qiyotganingizda, bu juda qo'rqinchli ko'rinadi deb o'ylagandirsiz? :) Lekin bu faqat bu narsa qanday ishlashini aniqlamagunimizcha. Keling, hozir tuzatamiz! Keling, oxiridan boshlaylik. biz boshida gapirgan System.insinfning ob'ektidir . InputStreamBu kiruvchi oqim bo'lib, u tizimni kiritish qurilmasiga - klaviaturaga bog'langan. Aytgancha, siz u bilan bilvosita tanishsiz. Axir, siz o'zingizning ishingizda uning "hamkasbi" dan tez-tez foydalanasiz - System.out! - bu tizim ma'lumotlarini chiqarishSystem.out oqimi , u siz doimo foydalanadigan usulda konsolga chiqarish uchun ishlatiladi :) - konsolga ma'lumotlarni yuborish uchun oqim va - klaviaturadan ma'lumotlarni qabul qilish uchun. Bu oddiy :) Bundan tashqari: klaviaturadan ma'lumotlarni o'qish uchun biz bu katta qurilishsiz qila olamiz va oddiygina yozamiz: ; System.out.println()System.outSystem.inSystem.in.read()
public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Sinfda InputStream(va System.insizga eslatib o'taman, bu sinf ob'ekti ) ma'lumotlarni o'qish imkonini beruvchi InputStreamusul mavjud . read()Bitta muammo: u belgilarni emas, balki baytlarni o'qiydi . Keling, klaviaturadan ruscha "Ya" harfini o'qishga harakat qilaylik. Konsol chiqishi:
Я
208
175
10
Rus harflari kompyuter xotirasida 2 baytni egallaydi (ingliz harflaridan farqli o'laroq, ular faqat 1 baytni egallaydi). Bunday holda, oqimdan 3 bayt o'qildi: birinchi ikkitasi bizning "I" harfimizni ifodalaydi, ikkinchisi esa satr uzilishidir (Enter). Shuning uchun, "yalang'och" dan foydalanish varianti System.inbizga mos kelmaydi. Odamlar (kamdan-kam istisnolardan tashqari!) baytlarni o'qiy olmaydi. Bu erda keyingi sinf bizning yordamimizga keladi - InputStreamReader! Keling, bu qanday hayvon ekanligini aniqlaylik.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Biz oqimni System.in. InputStreamReaderUmuman olganda, agar siz uning nomini rus tiliga tarjima qilsangiz, hamma narsa aniq ko'rinadi - "kiruvchi oqimlarni o'quvchi". Aslida, aynan shu narsa uchun! Biz sinf ob'ektini yaratamiz InputStreamReaderva unga ma'lumotlarni o'qishi kerak bo'lgan kiruvchi oqimni uzatamiz. Ushbu holatda...
new InputStreamReader(System.in)
... biz unga aytamiz: "siz tizim kirish oqimidan (klaviatura) ma'lumotlarni o'qiysiz." Ammo bu uning yagona vazifasi emas! InputStreamReadernafaqat oqimdan ma'lumotlarni oladi. Bundan tashqari, bayt oqimlarini belgilar oqimiga aylantiradi . Boshqacha qilib aytganda, o'qilgan ma'lumotlarni "kompyuter" tilidan "inson" tiliga tarjima qilish haqida endi tashvishlanishingiz shart emas - InputStreamReaderbu siz uchun hamma narsani qiladi. InputStreamReader, albatta, nafaqat konsoldan, balki boshqa joylardan ham ma'lumotlarni o'qiy oladi. Masalan, fayldan:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
Bu erda biz kiruvchi ma'lumotlar oqimini yaratdik FileInputStream(bu navlardan biri InputStream), unga faylga yo'lni o'tkazdik va oqimning o'zini InputStreamReader'y. Endi u ushbu fayldagi ma'lumotlarni o'qiy oladi, agar ushbu yo'lda fayl mavjud bo'lsa, albatta. Ma'lumotlarni o'qish uchun (qaerdan, konsoldan, fayldan yoki boshqa joydan qat'i nazar), InputStreamReadersinf read(). System.in.read()va o'rtasidagi farq nima InputStreamReader.read()? dan foydalanib bir xil “I” harfini sanashga harakat qilaylik InputStreamReader. Sizga eslatib o'taman, men shunday deb o'yladim System.in.read():
Я
208
175
10
Qanday qilib u xuddi shu ishni qila oladi InputStreamReader?
public class Main {

   public static void main(String[] args) throws IOException {

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
Konsol chiqishi:
Я
1071
10
Farqi darhol ko'rinadi. Oxirgi bayt - qatorlar uchun - o'zgarishsiz qoldi (10 raqami), lekin o'qilgan "I" harfi bitta "1071" kodiga aylantirildi. Bu belgilar bilan o'qiladi! Agar siz kutilmaganda 1071 kodi "I" harfini anglatishiga ishonmasangiz, buni tekshirish oson :)
import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       char x = 1071;
       System.out.println(x);
   }
}
Konsol chiqishi:

Я
Ammo InputStreamReaderbu juda yaxshi bo'lsa, nega sizga ko'proq kerak BufferedReader? InputStreamReaderham ma'lumotlarni o'qiy oladi, ham baytlarni belgilarga aylantira oladi - bizga yana nima kerak? Nega boshqa o'quvchi? :/ Javob juda oddiy - yuqori mahsuldorlik va katta qulaylik uchun . Keling, ishlashdan boshlaylik. Ma'lumotlarni o'qishda BufferedReader maxsus maydondan - buferdan foydalanadi, u erda o'qilgan belgilarni "qo'shadi". Natijada, dasturda ushbu belgilar kerak bo'lganda, ular to'g'ridan-to'g'ri ma'lumotlar manbasidan (klaviatura, fayl va boshqalar) emas, balki buferdan olinadi va bu juda ko'p resurslarni tejaydi. Bu qanday ishlashini tushunish uchun, masalan, yirik kompaniyadagi kurerning ishini tasavvur qiling. Kuryer ofisda o'tiradi va unga posilkalarni etkazib berish uchun olib kelishini kutadi. Har safar yangi posilka olganida, u darhol yo'lga chiqishi mumkin. Ammo kun davomida posilkalar ko'p bo'lishi mumkin va u har safar ofis va manzillar o'rtasida sayohat qilishi kerak bo'ladi. Buning o'rniga, kurer ofisga har kim o'z posilkalarini qo'yishi mumkin bo'lgan quti qo'ydi. Endi kurer xotirjamlik bilan qutini olib, manzillarga borishi mumkin - u ko'p vaqtni tejaydi, chunki u har safar ofisga qaytishi shart emas. Ushbu misoldagi quti aniq bufer, ofis esa ma'lumotlar manbai. Kuryerga xatni yetkazib berishda umumiy qutidan olish har safar ofisga borishdan ko‘ra osonroq. Bu gazni ham tejaydi. Dasturda ham xuddi shunday - har safar ma'lumotlar manbasiga kirishdan ko'ra, buferdan ma'lumotlarni olish uchun resurslarni talab qilish ancha kam. Shuning uchun BufferedReader+ InputStreamReaderoddiy ga qaraganda tezroq ishlaydi InputStreamReader. Biz ishlashni saralab oldik, lekin qulaylik haqida nima deyish mumkin? Asosiy afzalligi shundaki, BufferedReaderu bir vaqtning o'zida faqat bitta belgini emas (garchi read()bu maqsad uchun usul ham mavjud bo'lsa-da), balki butun satrlarni ham o'qiy oladi! Bu yordamida amalga oshiriladi readLine();
public class Main {

   public static void main(String[] args) throws IOException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println("We read this line from the keyboard:");
       System.out.println(s);
   }
}
Konsol chiqishi:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
Bu, ayniqsa, katta hajmdagi ma'lumotlarni o'qishda foydalidir. Bir yoki ikki satr matnni har bir belgi o'qish mumkin. Ammo "Urush va Tinchlik" ni birma-bir sanash biroz muammoli bo'ladi :) Endi iplarning ishi siz uchun yanada aniqroq bo'ldi. Qo'shimcha o'rganish uchun bu erda siz uchun qo'shimcha manba: Bu erda siz kiruvchi va chiquvchi oqimlar haqida ko'proq o'qishingiz mumkin. BufferedReaderTalabalarimizdan birining video sharhi . Ha, ha, bizning o'quvchilarimiz nafaqat o'zlarini o'rganishadi, balki boshqalar uchun ham o'quv videolarini yozib olishadi! Like bosishni va kanalimizga obuna bo'lishni unutmang :)
O'qishning boshidanoq rasmiy hujjatlarni o'qishga odatlanganingiz ma'qul. Bu til haqidagi bilimlarning asosiy manbai bo'lib, javoblarning ko'pini har doim u erda topish mumkin.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION