Салом! Лекцияи имруза ба ду кисм таксим мешавад. Мо баъзе мавзӯҳои кӯҳнаеро, ки қаблан ба онҳо дахл карда будем, такрор мекунем ва ба чанд хусусияти нав назар мекунем :)
Биёед аз аввалаш оғоз кунем. Такрор модари омӯзиш аст :) Шумо аллакай чунин синфро истифода кардаед
Албатта,
Пас, барои ин ба мо чӣ лозим аст? Аввалан , ба мо an objectи синфи нав лозим аст,
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](https://cdn.javarush.com/images/article/a9c20d21-571c-4db5-9630-526774308a7a/original.jpeg)
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](https://cdn.javarush.com/images/article/ccc47dda-0fc6-43ea-9197-4a37d9e802ad/original.jpeg)
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
, ки мо қариб дар ҳар як дарс истифода мебурдем, фаҳмидем :) Дар лексияҳои оянда вохӯрем!
GO TO FULL VERSION