JavaRush /Java блогы /Random-KK /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 пернесін басу). Байттарды оқу - бұл рахат, сондықтан оны 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
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. Бұл егіз ағайындылар жіп класының нысандары болып табылады. 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Сонда бұл үшін бізге не керек? Біріншіден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әр сабақта қолданатын жаңа мүмкіндіктер туралы білдік :) Келесі дәрістерде кездескенше!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION