Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

ugdaka avatar ugdaka 4 Точки

BufferedReader in Java

Здравейте колеги, поради настоящото домашно по Java, исках да попитам дали някой може да ми обясни за BufferedReader?
Малко ми е трудно навлизането от C# към Java. Благодаря Ви, предварително! :)

Тагове:
0
Fundamentals Module
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки
Best Answer

Здравей,

Входните и изходни операции са бавни поради взаимодействието им с външни устройства. Когато използваме обект на класа 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();

}

Надявам се това горе - долу да ти е помогнало.                 

11
Pafo37 avatar Pafo37 21 Точки

Колега, ще може ли да обясниш къде бъркам, че вече ще си оскубя косата. Използвам това :

BufferedReader f=new BufferedReader(new FileReader("lines.txt"));

и new File reader("lines.txt") ми го подчертава i казва Unhandled expection java.io.FileNotFoundException .Предполагам, че тук трябва да ползвам try и  catch като в catch трябва да сложа

catch (FileNotFoundException ex)

и понеже в една от лекциите, лекторът използва

System.out.println("hvanah te!");

и скромната ми програмка стана :

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! Ако може да ми обясниш, защото изобщо не разбирам идеята.

0
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки

Хаха така както си го написал е коректно ... и правилно ти мята ексепшъна.

Първо: синтаксиса на try with ressources e

try (BufferedReader f=new BufferedReader(new FileReader("lines.txt"))){ 
    System.out.println(f);
  }
    catch (FileNotFoundException ex){
        System.out.println("hvanah te!");
    }

Второ така дефиниран файла, ще го търси в ROOT на приложението, а ако там липсва е нормално да мята ексепшън. По - принцип аз процедирам по следния начин:

Създавам си една директория res -> в която са ми всички файлове, входящи и изходящи

Дефинирам си една константа File в която дефинирам пътя до файла

И на стрийма подавам константата

В код:

https://github.com/A4B5TQ/SoftUni/blob/master/JavaFundamental/JavaStreams/src/SumLines.java

0
25/03/2016 13:13:02
Pafo37 avatar Pafo37 21 Точки

Копирах ти кода, направих папка res, сложих lines.txt  и ми дава грешка :

java.io.FileNotFoundException: res\lines.txt (The system cannot find the file specified)
 

Пробвах да напиша цялата директория, пак същата грешка.

0
enevlogiev avatar enevlogiev 1168 Точки

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.

6
25/03/2016 10:21:09
ugdaka avatar ugdaka 4 Точки

Много изчерпателен отговор! Много благодаря! 

0
aleksshao avatar aleksshao 19 Точки

За да го разбереш и практически, гледай последната лекция от курса, особено в частта с решаването на задачата от упражнението от лектора! Ето ти линка  на лекцията - https://softuni.bg/trainings/resources/video/8190/video-ivank-yonkov-java-fundamentals-march-2016

0
EyubDjelil avatar EyubDjelil 9 Точки

IntelliJ или Eclipse ползваш, струва ми се че може да е нещо просто като "\\" за пътя на директорията. 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.