Salom! Ma'ruzalar va topshiriqlarda biz konsolga ma'lumotlarni chiqarishni va aksincha - klaviaturadan ma'lumotlarni o'qishni o'rgandik. Buning 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:- Kiruvchi oqim ( Kirish ) - ma'lumotlarni qabul qilish uchun ishlatiladi
- Chiquvchi oqim ( Chiqish ) - ma'lumotlarni yuborish uchun.
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.in
sinfning ob'ektidir . InputStream
Bu 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.out
System.in
System.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.in
sizga eslatib o'taman, bu sinf ob'ekti ) ma'lumotlarni o'qish imkonini beruvchi InputStream
usul 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.in
bizga 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
. InputStreamReader
Umuman 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 InputStreamReader
va 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! InputStreamReader
nafaqat 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 - InputStreamReader
bu 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), InputStreamReader
sinf 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 InputStreamReader
bu juda yaxshi bo'lsa, nega sizga ko'proq kerak BufferedReader
? InputStreamReader
ham 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
+ InputStreamReader
oddiy ga qaraganda tezroq ishlaydi InputStreamReader
. Biz ishlashni saralab oldik, lekin qulaylik haqida nima deyish mumkin? Asosiy afzalligi shundaki, BufferedReader
u 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. BufferedReader
Talabalarimizdan 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 :)
- BufferedReader/InputStreamReader - JavaRush ma'ruzalaridan biri
BufferedReader
.InputStreamReader
- InputStreamReader sinfi
- Class BufferedReader - sinflar haqida Oracle hujjatlari
BufferedReader
vaInputStreamReader
.
GO TO FULL VERSION