JavaRush /Java блогы /Random-KK /Пернетақтадан оқу – «оқырмандар»

Пернетақтадан оқу – «оқырмандар»

Топта жарияланған
Сәлеметсіз бе! Дәрістер мен тапсырмаларда біз деректерді консольге шығаруды үйрендік, ал керісінше - пернетақтадан деректерді оқу. Пернетақтадан оқу - «оқырмандар» - 1Сіз тіпті бұл үшін күрделі құрылысты қолдануды үйрендіңіз:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Бірақ біз әлі бір сұраққа жауап берген жоқпыз.

Бұл тіпті қалай жұмыс істейді?

Шындығында, кез келген бағдарлама көбінесе өздігінен болмайды. Ол басқа бағдарламалармен, жүйелермен, Интернетпен және т.б. «Коммуникация» сөзі арқылы біз ең алдымен «деректермен алмасу» дегенді түсінеміз. Яғни, кейбір деректерді сырттан қабылдап, керісінше, өз деректеріңізді бір жерге жіберіңіз. Тіпті күнделікті өмірде де бағдарламалар арасында деректер алмасудың көптеген мысалдары бар. Сонымен, көптеген сайттарда тіркелудің орнына Facebook немесе Twitter тіркелгісін пайдаланып кіруге болады. Бұл жағдайда екі бағдарлама, мысалы, Twitter және тіркелгіңіз келетін сайт бір-бірімен қажетті деректерді алмасады, содан кейін сіз түпкілікті нәтижені көресіз - сәтті авторизация. « Ағын » термині бағдарламалауда деректер алмасу процесін сипаттау үшін жиі қолданылады . Бұл атау қайдан шыққан? «Ағын» бағдарламалаудан гөрі өзен немесе ағынмен байланысты. Шындығында, бұл себепсіз емес :) Ағын - мәні бойынша, деректердің қозғалатын бөлігі. Яғни, бағдарламалауда ағын бойымен «ағылатын» су емес, byte пен таңба түріндегі деректер. Деректер ағынынан біз деректерді бөліктерге бөліп алып, онымен бірдеңе жасай аламыз. Тағы да «су ағып жатқан» ұқсастығын қолданайық: сорпа пісіру, отты сөндіру немесе гүлдерді суару үшін өзеннен су алуға болады. Ағындарды пайдалана отырып, сіз кез келген деректер көзімен жұмыс істей аласыз: Интернет, компьютердің файлдық жүйесі немесе басқа нәрсе - бұл маңызды емес. Ағындар әмбебап құрал болып табылады. Олар бағдарламаға деректерді кез келген жерден (кіріс ағындары) қабылдауға және оны кез келген жерге (шығыс ағындар) жіберуге мүмкіндік береді. Олардың міндеті біреу - деректерді бір жерде алып, оны басқа жерге жіберу. Ағындар екі түрге бөлінеді:
  1. Кіріс ағыны ( Input ) - деректерді қабылдау үшін қолданылады
  2. Шығыс ағыны ( Output ) - деректерді жіберу үшін.
Java-дағы кіріс деректер ағыны сыныпта InputStream, ал шығыс деректер ағыны сыныпта жүзеге асырылады OutputStream. Бірақ жіптерді бөлудің тағы бір жолы бар. Олар кіріс және шығыс болып қана емес, сонымен қатар byte және таңба болып бөлінеді . Мұнда мағынасы түсіндірілместен түсінікті: byte ағыны ақпаратты byteтар жиыны түрінде, ал символдар ағыны символдар жиыны түрінде ақпаратты береді. Бұл лекцияда біз кіріс ағындары туралы егжей-тегжейлі қарастырамыз. Мен шығыс сілтемелер туралы ақпаратты соңында қосамын, сіз бұл туралы өзіңіз оқи аласыз :) Сонымен, біздің code:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Сіз лекцияларды оқып отырып, бұл өте қорқынышты көрінеді деп ойлаған шығарсыз? :) Бірақ бұл нәрсенің қалай жұмыс істейтінін анықтағанша ғана. Қазір түзетейік! Соңынан бастайық. бұл біз басында айтқан System.inсыныптың an objectісі . InputStreamБұл кіріс ағыны және ол жүйелік енгізу құрылғысына - пернетақтаға байланысты. Айтпақшы, сіз онымен жанама түрде таныссыз. Өйткені, сіз өз жұмысыңызда оның «әріптесін» жиі қолданасыз - System.out! - бұл жүйелік деректерді шығаруSystem.out ағыны , ол сіз үнемі қолданатын әдіс бойынша консольге шығару үшін пайдаланылады :) - деректерді консольге жіберуге арналған ағын және - пернетақтадан деректерді қабылдау үшін. Бұл қарапайым :) Сонымен қатар: деректерді пернетақтадан оқу үшін біз бұл үлкен құрылыссыз жасай аламыз және жай ғана жаза аламыз: ; 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);
       }
   }
}
Сыныпта InputStream(және System.inестеріңізге сала кетейін, бұл сыныптың an objectісі болып табылады ) деректерді оқуға мүмкіндік беретін InputStreamәдіс бар . read()Бір мәселе: ол таңбаларды емес, byteтарды оқиды . Пернетақтадан орысша «Я» әрпін оқып көрейік. Консоль шығысы:
Я
208
175
10
Орыс әріптері компьютер жадында 2 byteты алады (ағылшын әріптерінен айырмашылығы, олар тек 1 byte алады). Бұл жағдайда ағыннан 3 byte оқылды: алғашқы екеуі біздің «I» әрпін білдіреді, ал екіншісі - жол үзілімі (Enter). Сондықтан «жалаңашты» пайдалану опциясы System.inбізге сәйкес келмейді. Адамдар (сирек жағдайларды қоспағанда!) byteтарды оқи алмайды. Міне, келесі сынып бізге көмекке келеді - InputStreamReader! Бұл қандай жануар екенін анықтайық.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Біз ағынды System.in. InputStreamReaderЖалпы, егер сіз оның атын орыс тіліне аударсаңыз, бәрі анық көрінеді - «кіріс ағындарының оқырманы». Шын мәнінде, бұл дәл осы үшін! Біз сынып нысанын жасаймыз InputStreamReaderжәне оған деректерді оқуы керек кіріс ағынын береміз. Бұл жағдайда...
new InputStreamReader(System.in)
...біз оған айтамыз: «сіз жүйенің енгізу ағынынан (пернетақта) деректерді оқисыз». Бірақ бұл оның жалғыз функциясы емес! InputStreamReaderағыннан деректерді ғана қабылдап қоймайды. Ол сондай-ақ byte ағындарын таңбалар ағынына түрлендіреді . Басқаша айтқанда, оқылған деректерді «компьютер» тілінен «адам» тіліне аудару туралы алаңдамаудың қажеті жоқ - InputStreamReaderол сіз үшін бәрін жасайды. InputStreamReader, әрине, деректерді тек консольден ғана емес, басқа жерлерден де оқи алады. Мысалы, файлдан:
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"));
   }
}
Мұнда біз кіріс деректер ағынын жасадық FileInputStream(бұл сорттардың бірі InputStream), оған файлдың жолын бердік және ағынның өзін InputStreamReader'y. Енді ол осы файлдағы деректерді оқи алады, егер осы жолдағы файл бар болса, әрине. Деректерді оқу үшін (қайдан, консольден, файлдан немесе кез келген басқа жерден) сынып InputStreamReaderсонымен қатар read(). System.in.read()және арасындағы айырмашылық неде InputStreamReader.read()? «Мен» әрпін пайдаланып санап көрейік InputStreamReader. Еске сала кетейін, мен мынаны ойладым System.in.read():
Я
208
175
10
Ол сол жұмысты қалай істей алады 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);
       }
   }
}
Консоль шығысы:
Я
1071
10
Айырмашылық бірден көрінеді. Соңғы byte - жол үзілімдері үшін - өзгеріссіз қалды (10 саны), бірақ оқылатын «I» әрпі «1071» жалғыз codeына айналдырылды. Бұл символдар бойынша оқу! Егер сіз кенеттен 1071 codeы «I» әрпін білдіретініне сенбесеңіз, оны оңай тексеруге болады :)
import java.io.IOException;

public class Main {

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

       char x = 1071;
       System.out.println(x);
   }
}
Консоль шығысы:

Я
Бірақ егер InputStreamReaderол соншалықты жақсы болса, неге сізге көбірек қажет BufferedReader? InputStreamReaderдеректерді оқи алады және byteтарды таңбаларға түрлендіре алады - бізге тағы не керек? Неліктен басқа оқырман? :/ Жауап өте қарапайым - жоғары өнімділік пен ыңғайлылық үшін . Орындаудан бастайық. Деректерді оқу кезінде BufferedReader арнайы аумақты – буферді пайдаланады, онда ол оқылған таңбаларды «қосатын». Нәтижесінде, бұл символдар бағдарламада қажет болғанда, олар тікелей деректер көзінен (пернетақта, файл және т.б.) емес, буферден алынады және бұл көптеген ресурстарды үнемдейді. Мұның қалай жұмыс істейтінін түсіну үшін, мысалы, ірі компаниядағы курьердің жұмысын елестетіп көріңіз. Курьер кеңседе отырады және оған жеткізілім үшін сәлемдемелердің келуін күтеді. Жаңа сәлемдеме алған сайын ол бірден жолға шығады. Бірақ күндіз сәлемдеме көп болуы мүмкін және ол әр кезде кеңсе мен мекенжай арасында жүруге мәжбүр болады. Оның орнына курьер кеңсеге әркім сәлемдемелерін қоя алатын жәшік қойды. Енді курьер қорапты сабырлы түрде алып, мекенжайларға бара алады - ол көп уақытты үнемдейді, өйткені ол әр уақытта кеңсеге қайта оралмайды. Бұл мысалдағы қорап дәл буфер, ал кеңсе деректер көзі болып табылады. Курьерге хатты жеткізу кезінде кеңсеге барған сайын қарапайым жәшіктен алу әлдеқайда оңай. Бұл газды да үнемдейді. Бағдарламада да солай - деректер көзіне әр уақытта қол жеткізудің орнына буферден деректерді алу ресурсты аз қажет етеді. Сондықтан BufferedReader+ InputStreamReaderжай ғана қарағанда жылдамырақ жұмыс істейді InputStreamReader. Біз өнімділікті сұрыптадық, бірақ ыңғайлылық туралы не деуге болады? Негізгі артықшылығы - BufferedReaderол деректерді бір уақытта бір таңбаны ғана емес (бірақ read()оның бұл мақсатқа арналған әдісі бар), сонымен қатар бүкіл жолдарды оқи алады! Бұл арқылы жасалады 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);
   }
}
Консоль шығысы:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
Бұл деректердің үлкен көлемін оқығанда әсіресе пайдалы. Мәтіннің бір немесе екі жолын әлі де таңба бойынша оқуға болады. Бірақ «Соғыс пен бейбітшілікті» бір-бір әріппен санау біршама қиын болады :) Енді жіптердің жұмысы сізге әлдеқайда түсінікті болды. Қосымша зерттеу үшін міне, сізге қосымша дереккөз: Мұнда сіз кіріс және шығыс ағындар туралы көбірек оқи аласыз. BufferedReaderСтуденттеріміздің бірінен бейне шолу . Иә, иә, біздің студенттер өздерін үйреніп қана қоймай, басқаларға да танымдық бейнелерді түсіреді! Лайк басуды және каналымызға жазылуды ұмытпаңыз :)
Оқудың басынан бастап ресми құжаттарды оқуға дағдыланған дұрыс. Бұл тіл туралы білімнің негізгі көзі және жауаптардың көпшілігін әрқашан сол жерден табуға болады.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION