JavaRush /Блоги Java /Random-TG /Хондан аз клавиатура - "хонандагон"

Хондан аз клавиатура - "хонандагон"

Дар гурӯҳ нашр шудааст
Салом! Дар лексияҳо ва супоришҳо мо тарзи баровардани маълумотро ба консол ва баръакс - хондани маълумотро аз клавиатура омӯхтем. Хондан аз клавиатура - "хонандагон" - 1Шумо ҳатто барои ин истифода бурдани сохтори мураккабро омӯхтаед:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Аммо мо то ҳол ба як савол ҷавоб надодаем.

Ин ҳатто чӣ гуна кор мекунад?

Дар асл, ҳама гуна барнома аксар вақт мустақилона вуҷуд надорад. Он метавонад бо дигар барномаҳо, системаҳо, Интернет ва ғайра муошират кунад. Бо калимаи «муошират» мо пеш аз ҳама «мубодилаи маълумот»-ро дар назар дорем. Яъне, баъзе маълумотро аз берун қабул кунед ва, баръакс, маълумоти шахсии худро ба ҷое фиристед. Мисоли зиёди мубодилаи маълумот байни барномаҳо, ҳатто дар ҳаёти ҳаррӯза вуҷуд дорад. Ҳамин тавр, дар бисёр сайтҳо, ба ҷои сабти ном, шумо метавонед бо истифода аз ҳисоби Facebook ё Twitter-и худ ворид шавед. Дар ин вазъият, ду барнома, гӯем, Twitter ва сайте, ки шумо кӯшиши сабти ном кардан мехоҳед, маълумоти заруриро бо ҳамдигар мубодила кунед, ки пас аз он шумо натиҷаи ниҳоӣ - авторизатсияи муваффақро мебинед. Истилоҳи " ҷараён " аксар вақт барои тавсифи раванди мубодилаи маълумот дар барномасозӣ истифода мешавад . Ин ном ҳатто аз куҷо пайдо шудааст? "Ҷараён" бештар бо дарё ё ҷараён алоқаманд аст, на бо барномасозӣ. Дар асл, ин бесабаб нест :) Ҷараён аслан як пораи ҳаракаткунандаи маълумот аст. Яъне, дар барномасозӣ на об дар қад-қади ҷараён "ҷой" мешавад, балки маълумот дар шакли byte ва аломатҳост. Аз ҷараёни додаҳо мо метавонем маълумотро қисмҳо қабул кунем ва бо он коре кунем. Боз ҳам, биёед аз қиёси "об ҷорӣ" истифода барем: шумо метавонед аз дарё об кашед, то шӯрбо пухтан, оташро хомӯш кунед ё гулҳоро об диҳед. Бо истифода аз ҷараён шумо метавонед бо ҳама гуна манбаи маълумот кор кунед: Интернет, системаи файлии компютери шумо ё чизи дигар - ин муҳим нест. Ҷараёнҳо як воситаи универсалӣ мебошанд. Онҳо ба барнома имкон медиҳанд, ки маълумотро аз ҳама ҷо (ҷараёнҳои воридотӣ) қабул кунанд ва онро ба ҳама ҷо фиристанд (ҷараёнҳои содиротӣ). Вазифаи онҳо як аст - гирифтани маълумот дар як ҷо ва фиристодани он ба ҷои дигар. Ҷараёнҳо ба ду намуд тақсим мешаванд:
  1. Ҷараёни воридотӣ ( Вуруд ) - барои қабули маълумот истифода мешавад
  2. Ҷараёни содиротӣ ( Натиҷа ) - барои фиристодани маълумот.
Ҷараёни додаҳои воридотӣ дар Java дар синф амалӣ карда мешавад InputStreamва ҷараёни додаҳои содиротӣ дар синф OutputStream. Аммо роҳи дигари тақсим кардани риштаҳо вуҷуд дорад. Онҳо на танҳо ба воридотӣ ва содиротӣ, балки ба byte ва характер низ тақсим мешаванд . Дар ин љо маъно бидуни тавзењот равшан аст: љараёни byte информатсияро дар шакли маљмўи byteњо ва љараёни аломатњо информатсияро дар шакли маљмўи аломатњо мефиристад. Дар ин лексия мо дар бораи ҷараёнҳои воридотӣ муфассал маълумот медиҳем. Ва ман дар охир маълумотро дар бораи истинодҳои содиротӣ замима мекунам ва шумо метавонед дар ин бора худатон хонед :) Ҳамин тавр, рамзи мо:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Шумо эҳтимол ҳангоми хондани лексияҳо фикр кардаед, ки ин хеле даҳшатнок аст? :) Аммо ин танҳо то он даме, ки мо фаҳмем, ки ин кор чӣ гуна кор мекунад. Биёед ҳоло онро ислоҳ кунем! Биёед аз охир сар кунем. System.inan objectи синфест InputStream, ки мо дар аввал дар бораи он сухан ронда будем. Ин ҷараёни воридотӣ аст ва он ба дастгоҳи вуруди система - клавиатура пайваст аст. Зимнан, шумо бавосита бо ӯ шинос ҳастед. Охир, шумо «хамкасби»-и уро дар кори худ зуд-зуд истифода мебаред- System.out! System.out- ин ҷараёни баромади додаҳои система аст , он барои баровардан ба консол бо ҳамон усуле истифода мешавад 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);
       }
   }
}
Дар синф 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. Умуман, агар шумо номи онро ба забони русӣ тарҷума кунед, ҳама чиз аён аст - "хонандаи ҷараёнҳои воридотӣ". Дар асл, ин маҳз барои он аст! Мо an objectи синфро эҷод мекунем 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()? Биёед кӯшиш кунем, ки ҳамон ҳарфи “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
Фарқият фавран намоён мешавад. Байти охирин - барои танаффусҳои сатрҳо - бетағйир монд (рақами 10), аммо ҳарфи хондани "I" ба рамзи ягонаи "1071" табдил ёфт. Ин аз рӯи аломатҳо хонда мешавад! Агар шумо ногаҳон бовар накунед, ки рамзи 1071 маънои ҳарфи "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 майдони махсус - буферро истифода мебарад, ки дар он аломатҳои хондашударо "илова мекунад". Дар натиҷа, вақте ки ба мо ин аломатҳо дар барнома лозим мешаванд, онҳо на мустақиман аз манбаи додаҳо (клавиатура, файл ва ғайра) аз буфер гирифта мешаванд ва ин захираҳои зиёдеро сарфа мекунад. Барои фаҳмидани он, ки ин чӣ гуна кор мекунад, масалан, кори хаткашонро дар як ширкати калон тасаввур кунед. Хаткашон дар офис нишаста, мунтазири он аст, ки посылка барои фиристодан ба ӯ оварда шавад. Хар боре, ки посылкаи нав мегирад, вай дархол ба рох баромада метавонад. Аммо мумкин аст, ки дар давоми рӯз посылка зиёд бошад ва ӯ маҷбур мешавад, ки ҳар дафъа байни идора ва addressҳо сафар кунад. Ба ҷои ин, хаткашон дар офис қуттича гузошт, ки ҳар кас метавонист посылкаҳои худро гузорад. Акнун хаткашон метавонад оромона куттиро гирифта, ба addressхо равад — вай вакти зиёдеро сарфа мекунад, зеро хар дафъа ба идора баргаштан лозим нест. Қуттии ин мисол маҳз буфер аст ва офис манбаи маълумот аст. Барои хаткашон хангоми супурдан аз куттии умумй мактуб гирифтан назар ба хар дафъа ба идора рафтан осонтар аст. Он инчунин газро сарфа мекунад. Дар барнома низ ҳамин тавр аст - гирифтани маълумот аз буфер ба ҷои дастрас шудан ба манбаи додаҳо ҳар дафъа захираҳои камталаб аст. Аз ин рӯ, 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