JavaRush /Java блогу /Random-KY /Клавиатурадан окуу - "окуучулар"

Клавиатурадан окуу - "окуучулар"

Группада жарыяланган
Салам! Лекцияларда жана тапшырмаларда биз маалыматтарды консолго чыгарууну үйрөндүк жана тескерисинче - клавиатурадан маалыматтарды окуу. Клавиатурадан окуу - "окуучулар" - 1Сиз бул үчүн татаал курулушту колдонууну үйрөндүңүз:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Бирок биз дагы бир суроого жооп бере элекпиз.

Бул кантип иштейт?

Чынында, ар кандай программа көбүнчө өз алдынча жок. Ал башка программалар, системалар, Интернет ж.б.у.с. менен байланыша алат. "Байланыш" деген сөз менен биз биринчи кезекте "маалымат алмашуу" дегенди түшүнөбүз. Башкача айтканда, кээ бир маалыматтарды сырттан алып, тескерисинче, өзүңүздүн маалыматтарыңызды бир жакка жөнөтүңүз. Күнүмдүк турмушта да программалар ортосунда маалымат алмашуунун көптөгөн мисалдары бар. Ошентип, көптөгөн сайттарда каттоонун ордуна, Facebook же Twitter аккаунтуңуз менен кире аласыз. Бул кырдаалда, эки программа, айталы, Twitter жана сиз каттоого аракет кылып жаткан сайт, бири-бири менен керектүү маалыматтарды алмашат, андан кийин сиз акыркы натыйжаны көрөсүз - ийгorктүү авторизация. " Агым " термини көбүнчө программалоодо маалымат алмашуу процессин сүрөттөө үчүн колдонулат . Бул ат кайдан пайда болгон? "Агым" программалоого караганда дарыя же агым менен көбүрөөк байланыштуу. Чынында, бул бекеринен эмес :) Агым – бул, негизинен, кыймылдуу маалымат. Башкача айтканда, программалоодо агым боюнча «аккан» суу эмес, byte жана символ түрүндөгү маалыматтар. Маалымат агымынан биз маалыматтарды бөлүктөргө бөлүп алып, аны менен бир нерсе кыла алабыз. Дагы бир жолу, "суу агып жаткан" аналогияны колдонолу: шорпо кайнатуу, от өчүрүү же гүлдөрдү сугаруу үчүн дарыядан суу алып койсоңуз болот. Агымдарды колдонуу менен сиз каалаган маалымат булагы менен иштей аласыз: Интернет, компьютериңиздин файл системасы же башка нерсе - бул маанилүү эмес. Агымдар универсалдуу курал болуп саналат. Алар программага маалыматтарды каалаган жерден (кирүүчү агымдар) кабыл алууга жана каалаган жерге жөнөтүүгө (чыгыш агымдары) мүмкүндүк берет. Алардын милдети бир - маалыматтарды бир жерден алып, башка жерге жөнөтүү. Агымдар эки түргө бөлүнөт:
  1. Кирүүчү агым ( Киргизүү ) - маалыматтарды алуу үчүн колдонулат
  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Жалпысынан алганда, анын атын орус тorне которсоңуз, баары ачык көрүнөт - "кирүүчү агымдардын окурманы". Чынында, бул так эмне үчүн! Биз класс an objectин түзүп InputStreamReader, ага маалыматтарды окуй турган кириш агымын өткөрүп беребиз. Бул учурда...
new InputStreamReader(System.in)
... биз ага: "сиз системанын киргизүү агымынан (клавиатура) маалыматтарды окуйсуз" деп айтабыз. Бирок бул анын жалгыз функциясы эмес! InputStreamReaderагымдан маалыматтарды гана кабыл албастан. Ал ошондой эле byte агымдарын символдук агымдарга айлантат . Башкача айтканда, окулган маалыматтарды "компьютер" тorнен "адам" тorне которуу үчүн мындан ары тынчсыздануунун кереги жок - 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. Эми бул жолдогу файл, албетте, бар болсо, бул файлдан маалыматтарды окуй алат. Маалыматтарды окуу үчүн (кайдан, консолдон, файлдан же башка жерден) класс InputStreamReaderошондой эле read(). System.in.read()менен ортосунда кандай айырма бар InputStreamReader.read()? Келгиле, ошол эле “I” тамгасын колдонуп санаганга аракет кылалы 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Студенттерибиздин биринин видеосу . Ооба, ооба, биздин студенттер өздөрүн гана үйрөнбөстөн, башкаларга тарбия берүүчү видеолорду да тартышат! Биздин каналга жазылганды жана лайк басканды унутпаңыз :)
Окуумдун башынан эле расмий documentтерди окууга көнүп алганыңыз оң. Бул тил жөнүндө бorмдин негизги булагы жана жооптордун көбүн дайыма ошол жерден тапса болот.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION