JavaRush /Java блогу /Random-KY /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ал маалыматтарды атайын буферге окуп, топтойт, биз аны кийинчерээк кабыл алабыз. Натыйжада, маалымат булагына чалуулардын саны бир нече эсеге, ал тургай ондогон эсеге кыскарат! Дагы бир кошумча өзгөчөлүгү 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();
   }
}
Файлдан берorштерди ага жолду өткөрүү менен окуй аласыз:
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Анда бул үчүн бизге эмне керек? БиринчиденPrintStream , бизге учурдагы an objectинин ордуна жаңы класс an objectи керек . Демейки боюнча класста орнотулган учурдагы 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'ге көчүрүп, иштете аласыз. Тексттик файлды ачуу менен, ал жерде керектүү сап ийгorктүү жазылганын көрөсүз :) Ушуну менен лекция аяктайт. Бүгүн биз агымдар жана окурмандар менен кантип иштөөнү эстедик, алардын бири-биринен кандайча айырмаланарын эстедик жана System.outдээрлик ар бир сабакта колдонгон жаңы мүмкүнчүлүктөр менен тааныштык :) Кийинки лекцияларда көрүшкөнчө!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION