BufferedReader in Java
Здравейте колеги, поради настоящото домашно по Java, исках да попитам дали някой може да ми обясни за BufferedReader?
Малко ми е трудно навлизането от C# към Java. Благодаря Ви, предварително! :)
Здравейте колеги, поради настоящото домашно по Java, исках да попитам дали някой може да ми обясни за BufferedReader?
Малко ми е трудно навлизането от C# към Java. Благодаря Ви, предварително! :)
Здравей,
Входните и изходни операции са бавни поради взаимодействието им с външни устройства. Когато използваме обект на класа InputStreamReader текстът се чете символ след символ и затова изисква многократен достъп до клавиатурата. По-ефективен начин е след като се натрупат в паметта достатъчно символи, да се прочетат наведнъж. Мястото където се събира такава информация се нарича “буфер”. Класът BufferedReader представлява такъв буфер, който натрупва входния поток и освен това съдържа метод за еднократно четене на цял текстов ред. Можем да създадем обект bInput на класа BufferedReader по следния начин:
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader bInput = new BufferedReader(input);
Двете команди могат да се обединят в една както следва:
BufferedReader bInput = new BufferedReader(new InputStreamReader(System.in));
Сега новата променлива bInput е свързана с клавиатурата и е обект на класа BufferedReader, поради което можем да прочетем цял текстов ред:
String line = bInput.readLine();
BufferedReader f = new BufferedReader(new InputStreamReader(new FileInputStream(“input.txt”)));
Тук потокът InputStreamReader превръща байтовете в символи.
BufferedReader f = new BufferedReader(new FileReader(“input.txt”));
Съдържанието на файла може да се изнесе с помощта на цикъл. Редовете се четат от файла с помощта на while-цикъл. Когато се достигне края на файла методът readLine връща null и цикълът приключва.
String line = f.readLine();
while(line!=null){
System.out.println(line);
line = f.readLine();
}
Надявам се това горе - долу да ти е помогнало.
BufferedReader в най-общия случай се закача за някакъв стрийм и чете character по character или пък направо цял ред. В документацията добре си личи, че е използван декоратор, въпреки че не е споменато. Този design pattern се учи в един друг курс, но в най-общи линии хващаш някой клас и му добавяш метод, без да променяш самия клас.
Та така и BufferedReader прави FileReader малко по-лесен за използване.
FileReader fileReader = new FileReader("D:/mytext.txt");
BufferedReader textReader = new BufferedReader(fileReader);
На практика вече имаме FileReader, който обаче освен всичките си готини функционалности има и метод readline(), който всеки софтуни студент би трябвало инстинктивно да разпознава. Използва се ей така:
String line = textReader.readLine();
В общия случай текстовите файлове имат повече от един ред, така че ползваш някакъв while, докато line не стане null.
Накрая трябва да затвориш всички ресурси.
textReader.close();
fileReader.close();
Доколкото си спомням, в Java, когато се ползват разни стриймове, в сигнатурата на метода трябва изрично да се посочи, че може и да хвърлят exception, примерно FIleNotFound, или IOException.
Може да прочетеш и за try - catch - finally.
Много изчерпателен отговор! Много благодаря!
За да го разбереш и практически, гледай последната лекция от курса, особено в частта с решаването на задачата от упражнението от лектора! Ето ти линка на лекцията - https://softuni.bg/trainings/resources/video/8190/video-ivank-yonkov-java-fundamentals-march-2016
IntelliJ или Eclipse ползваш, струва ми се че може да е нещо просто като "\\" за пътя на директорията.
Колега, ще може ли да обясниш къде бъркам, че вече ще си оскубя косата. Използвам това :
и new File reader("lines.txt") ми го подчертава i казва Unhandled expection java.io.FileNotFoundException .Предполагам, че тук трябва да ползвам try и catch като в catch трябва да сложа
и понеже в една от лекциите, лекторът използва
и скромната ми програмка стана :
try { BufferedReader f=new BufferedReader(new FileReader("lines.txt")); System.out.println(f); } catch (FileNotFoundException ex){ System.out.println("hvanah te!"); } }
като я пусна ми дава hvanah te! .Използваме catch кат очакваме някаква грешка, ако съм разбрал правилно, а единственият начин да не ми подчертае file reader е като му кажа да хване exceptionа .Тоест каквото и да прави ще ми излезе в случая hvanah te! Ако може да ми обясниш, защото изобщо не разбирам идеята.
Хаха така както си го написал е коректно ... и правилно ти мята ексепшъна.
Първо: синтаксиса на try with ressources e
Второ така дефиниран файла, ще го търси в ROOT на приложението, а ако там липсва е нормално да мята ексепшън. По - принцип аз процедирам по следния начин:
Създавам си една директория res -> в която са ми всички файлове, входящи и изходящи
Дефинирам си една константа File в която дефинирам пътя до файла
И на стрийма подавам константата
В код:
https://github.com/A4B5TQ/SoftUni/blob/master/JavaFundamental/JavaStreams/src/SumLines.java
Копирах ти кода, направих папка res, сложих lines.txt и ми дава грешка :
java.io.FileNotFoundException: res\lines.txt (The system cannot find the file specified)
Пробвах да напиша цялата директория, пак същата грешка.