Сәлеметсіз бе! Бүгінгі дәріс екі бөлімге бөлінеді. Бұрын қозғаған кейбір ескі тақырыптарды қайталап, жаңа мүмкіндіктерді қарастырамыз :) Біріншіден бастайық. Қайталау - оқудың анасы :) Сіз осындай сыныпты бұрыннан қолдандыңыз
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 пернесін басу). Байттарды оқу - бұл рахат, сондықтан оны 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
ол деректерді кейінірек қабылдай алатын арнайы буферде оқиды және жинақтайды. Нәтижесінде деректер көзіне қоңыраулар саны бірнеше есе, тіпті ондаған есе азаяды! «a» қосымшасының тағы бір ерекшелігі BufferedReader
және оның әдеттегіден артықшылығы - деректерді жеке сандар ретінде емес, тұтас жолдар ретінде оқитын 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
Әрине, 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
. Бұл егіз ағайындылар жіп класының нысандары болып табылады. 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
, біз мұны әлі де жасай аламыз! Сонда бұл үшін бізге не керек? БіріншіденPrintStream
, ағымдағы an objectінің орнына жаңа сынып нысаны қажет . Әдепкі бойынша сыныпта орнатылған ағымдағы нысан System
бізге сәйкес келмейді: ол консольді көрсетеді. Бізге деректеріміздің «тағайындалған жері» ретінде мәтіндік файлды көрсететін жаңасын жасау керек. Екіншіден , айнымалыға жаңа мән беруді түсіну керек System.out
. Сіз мұны осылай жасай алмайсыз, себебі ол белгіленген final
. Соңынан бастайық. Класта System
дәл бізге қажет әдіс бар - setOut()
. Ол нысанды кіріс ретінде қабылдайды 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