JavaRush /Блоги Java /Random-TG /Бо синфҳои BufferedReader ва InputStreamReader кор кардан...

Бо синфҳои BufferedReader ва InputStreamReader кор карданро машқ кунед

Дар гурӯҳ нашр шудааст
Салом! Лекцияи имруза ба ду кисм таксим мешавад. Мо баъзе мавзӯҳои кӯҳнаеро, ки қаблан ба онҳо дахл карда будем, такрор мекунем ва ба чанд хусусияти нав назар мекунем :) Машқи кор бо синфҳои BuffreredReader ва InputStreamReader - 1Биёед аз аввалаш оғоз кунем. Такрор модари омӯзиш аст :) Шумо аллакай чунин синфро истифода кардаед BufferedReader. Ман умедворам, ки шумо ин фармонро ҳанӯз фаромӯш накардаед:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Пеш аз хондани минбаъда, кӯшиш кунед, ки ҳар як ҷузъи ( System.in, InputStreamReader, BufferedReader) барои чӣ масъул аст ва онҳо барои чӣ заруранд, дар хотир доред. рӯй дод? Агар не, хавотир нашав :) Агар то ин дам шумо чизеро фаромӯш карда бошед, ин лексияи ба хонандагон бахшидашударо дубора хонед . Биёед мухтасар ба хотир орем, ки ҳар кадоми онҳо чӣ кор карда метавонанд. System.inришта барои гирифтани маълумот аз клавиатура мебошад. Аслан, барои татбиқи мантиқи хондани матн як нафар барои мо басанда хоҳад буд. Аммо, тавре ки шумо дар ёд доред, System.inон танҳо byteҳоро хонда метавонад, на аломатҳо:
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Агар мо ин codeро иҷро кунем ва дар консол ҳарфи "Y"-ро ворид кунем, натиҷа чунин хоҳад буд:

Й
208
153
10
Аломатҳои кириллӣ дар хотира 2 byteро ишғол мекунанд, ки дар экран нишон дода мешаванд (ва рақами 10 ифодаи byteи шикастани сатр аст, яъне пахшкунии Enter). Мутолиаи byteҳо чунин як лаззат аст, бинобар ин System.inдар шакли холис истифода бурдани он ногувор хоҳад буд. Барои хондани ҳарфҳои кириллӣ (ва на танҳо), ки ба ҳама фаҳмоанд, мо 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);
       }
   }
}
Агар мо як ҳарфи "Y"-ро ба консол ворид кунем, натиҷа ин дафъа дигар мешавад:

Й
1049
10
InputStreamReaderду byteи хондашударо (208, 153) ба рақами ягонаи 1049 табдил дод. Ин аз рӯи аломатҳо хонда мешавад. 1049 ба ҳарфи "Y" мувофиқат мекунад, ки онро ба осонӣ тафтиш кардан мумкин аст:
public class Main {

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

       char x = 1049;
       System.out.println(x);
   }
}
Натиҷаи консол:

Й
Хуб, барои BufferedReader'a (ва дар маҷмӯъ - BufferedAnything), синфҳои буферӣ барои оптимизатсияи кор истифода мешаванд. Дастрасӣ ба манбаи додаҳо (файл, консол, захира дар Интернет) аз нигоҳи иҷроиш кори хеле гаронарзиш аст. Аз ин рӯ, барои кам кардани шумораи чунин зангҳо, BufferedReaderон маълумотро дар буфери махсус мехонад ва ҷамъ мекунад, ки мо баъдтар онро қабул карда метавонем. Дар натиҷа, шумораи зангҳо ба манбаи маълумот якчанд маротиба ё ҳатто даҳҳо маротиба кам карда мешавад! Дигар хусусияти иловагии BufferedReader'a ва бартарии он нисбат ба муқаррарӣ InputStreamReader' усули бениҳоят муфид аст 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("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Машқи кор бо синфҳои BuffreredReader ва InputStreamReader - 2Албатта, BufferedReaderин механизми хеле чандир аст ва ба шумо имкон медиҳад, ки на танҳо бо клавиатура кор кунед. Шумо метавонед маълумотро, масалан, мустақиман аз Интернет тавассути интиқоли URL-и зарурӣ ба хонанда хонед:
public class URLReader {
   public static void main(String[] args) throws Exception {

       URL oracle = new URL("https://www.oracle.com/index.html");
       BufferedReader in = new BufferedReader(
               new InputStreamReader(oracle.openStream()));

       String inputLine;
       while ((inputLine = in.readLine()) != null)
           System.out.println(inputLine);
       in.close();
   }
}
Шумо метавонед маълумотро аз файл бо роҳи гузариш ба он хонед:
public class Main {
   public static void main(String[] args) throws Exception {

       FileInputStream fileInputStream = new FileInputStream("testFile.txt");
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

       String str;

       while ((str = reader.readLine()) != null)   {
           System.out.println (str);
       }

       reader.close();
   }
}

Иваз кардани System.out

Акнун биёед як имкони ҷолиберо бубинем, ки мо қаблан ба он дахл накардаем. Тавре ки шумо эҳтимол дар ёд доред, Systemдар синф ду майдони статикӣ мавҷуданд - System.inва System.out. Ин бародарони дугоникҳо an objectҳои синфи ришта мебошанд. System.in- синфи абстрактӣ InputStream. А System.out- синфи PrintStream. Ҳоло мо ба таври мушаххас дар бораи он сӯҳбат хоҳем кард System.out. Агар мо ба codeи сарчашмаи синф ворид шавем System, мо инро мебинем:
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
Ҳамин тавр, System.outтанҳо як тағирёбандаи синфи статикии муқаррарӣSystem . Дар он ҷодуе нест :) Тағирёбанда outба синф тааллуқ дорад PrintStream. Дар ин ҷо як саволи ҷолиб аст: чаро ҳангоми иҷро кардани code System.out.println()баромад дар консол пайдо мешавад, на дар ҷои дигар? Ва оё имкон дорад, ки инро бо ягон роҳ тағир дод? Масалан, мо мехоҳем маълумотро аз консол хонем ва онро ба файли матнӣ нависем. Оё имкон дорад, ки чунин мантиқро бидуни истифодаи синфҳои иловагии хонандагон ва нависандагон, балки танҳо бо истифода аз System.out. Ба ҳар ҳол то ҳадди имкон :) Ва гарчанде ки тағирёбанда System.outаз ҷониби тағирдиҳанда таъин шудааст final, мо ҳоло ҳам метавонем ин корро кунем! Машқи кор бо синфҳои BuffreredReader ва InputStreamReader - 3Пас, барои ин ба мо чӣ лозим аст? Аввалан , ба мо an objectи синфи нав лозим аст, PrintStreamба ҷои an objectи ҷорӣ. Объекти ҷории дар синф Systemбо нобаёнӣ насбшуда ба мо мувофиқат намекунад: он ба консол ишора мекунад. Мо бояд як файли наверо эҷод кунем, ки ба файли матнӣ ҳамчун "макон" барои маълумоти мо ишора кунад. Дуюм , шумо бояд фаҳмед, ки чӣ гуна ба тағирёбанда арзиши нав таъин кардан мумкин аст System.out. Шумо наметавонед танҳо ин тавр кунед, зеро он қайд карда шудааст final. Биёед аз охир сар кунем. Синф Systemмаҳз усули ба мо лозимиро дар бар мегирад - setOut(). Он an objectро ҳамчун вуруд қабул мекунад PrintStreamва онро ҳамчун нуқтаи баромад муқаррар мекунад. Маҳз он чизе ки ба мо лозим аст! Танҳо эҷоди an object аст PrintStream. Ин корро кардан низ осон аст:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Тамоми code чунин хоҳад буд:
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
Дар натиҷа, сатри аввал ба файли матнӣ навишта мешавад ва дуюмаш ба консол бароварда мешавад :) Шумо метавонед ин codeро ба IDE-и худ нусхабардорӣ кунед ва онро иҷро кунед. Бо кушодани файли матнӣ, шумо хоҳед дид, ки дар он ҷо сатри зарурӣ бомуваффақият навишта шудааст :) Бо ин лексия анҷом меёбад. Имрӯз мо ба ёд овардем, ки чӣ тавр бо ҷараёнҳо ва хонандагон кор кардан лозим аст, ба ёд овардем, ки чӣ тавр онҳо аз ҳамдигар фарқ мекунанд ва дар бораи хусусиятҳои наве System.out, ки мо қариб дар ҳар як дарс истифода мебурдем, фаҳмидем :) Дар лексияҳои оянда вохӯрем!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION