CodeGym /Java блог /Случаен /Практикувайте работа с класовете BuffreredReader и InputS...
John Squirrels
Ниво
San Francisco

Практикувайте работа с класовете BuffreredReader и InputStreamReader

Публикувано в групата
здрасти Днешният урок ще бъде разделен на две части за удобство. Ще повторим някои стари теми, които засегнахме преди, и ще разгледаме някои нови функции :) Да започнем с първата. Вече имаш клас като BufferedReaderмного пъти. Надявам се, че не сте имали време да забравите това изявление:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Преди да прочетете по-нататък, опитайте се да си спомните за Howво отговаря всеки компонент — System.in, InputStreamReader, BufferedReader— и защо е необходим. Помниш ли? Ако не, не се притеснявайте. :) Ако сте забравor нещо, прочетете отново този урок , който е посветен на часовете по четец. Ще припомним накратко Howво може всеки от тях. System.in— това е поток за получаване на данни от клавиатурата.  По принцип само то би било достатъчно, за да се приложи логиката, необходима за четене на текст. Но, Howто си спомняте, 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 и въведем кирилската буква "Й", изходът ще бъде:

Й
208
153
10 
Символите на кирorца заемат 2 byteа в паметта и се показват на екрана. Числото 10 е десетичното представяне на знак за подаване на ред, т.е. от натискане на Enter. Четенето на byteове е такова удоволствие, така че използването 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); 
       } 
   } 
} 
Въвеждаме същата буква "Й", но този път резултатът е различен:

Й 
1049 
10
InputStreamReaderпреобразува два byteа (208 и 153) в едно число 1049. Ето Howво означава да четеш знаци. 1049 отговаря на кирилската буква "Й". Лесно можем да се убедим, че това е вярно:

public class Main { 

   public static void main(String[] args) throws IOException { 
       char x = 1049; 
       System.out.println(x); 
   } 
} 
Конзолен изход:

Й
И Howто forBufferedReader(и като цяло, BufferedAnythingYouWant), буферираните класове се използват за оптимизиране на производителността. Достъпът до източник на данни (файл, конзола, уеб ресурс) е доста скъп по отношение на производителността. Следователно, за да намалим броя на достъпите, BufferedReaderчетем и натрупваме данни в специален буфер и ги получаваме оттам. В резултат на това броят на достъпите до източника на данни е намален — вероятно с няколко порядъка! Друга BufferedReaderособеност на и нейното предимство пред обикновения InputStreamReaderе изключително полезният readLine()метод, който чете цели редове данни, а не отделни числа. Това, разбира се, е супер удобно, когато работите с големи текстове. Ето How изглежда четенето на редове:

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 ("The user entered the following text:"); 
       System.out.println(s); 
       reader.close(); 
   } 
}

BufferedReader+InputStreamReader is faster than InputStreamReader alone 
The user entered the following text: 
BufferedReader+InputStreamReader is faster than InputStreamReader alone
Практикувайте работа с класовете BuffreredReader и InputStreamReader - 2Разбира се, BufferedReaderе много гъвкав. Не сте ограничени до работа с клавиатурата. Например, можете да четете данни директно от мрежата, просто като подадете необходимия URL address на четец:

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(); 
   } 
}
Можете да четете данни от файл, като подадете пътя на file:

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. Ако влезем в Systemизходния code на класа, виждаме това:

public final class System { 
……………... 
public final static PrintStream out = null; 
 ………… 
} 
По този начин  System.out  е просто обикновена статична променлива наSystem класа. Няма нищо магическо в това :) Променливата outе PrintStreamпрепратка. Ето един интересен въпрос: Когато System.out.println()се изпълнява, защо точно изходът отива в конзолата, а не някъде другаде? И може ли това да се промени по няHowъв начин? Да предположим например, че искаме да прочетем данни от конзолата и да ги запишем в текстов файл. Възможно ли е по няHowъв начин да се приложи това просто като се използват,  System.outа не допълнителни класове за четене и писане? Наистина е :) И можем да го направим, въпреки че System.outпроменливата е маркирана с finalмодификатора!  Практикувайте работа с класовете BuffreredReader и InputStreamReader - 3И така, Howво ни трябва, за да се случи това? На първо място, имаме нужда от нов PrintStreamобект, който да замени текущия. Текущият обект, зададен вSystemклас по подразбиране, не служи на нашите цели: той сочи към конзолата. Трябва да създадете нов, който сочи към текстов файл — „дестинацията“ за нашите данни. Второ, трябва да разберем How да присвоим нова стойност на System.outпроменливата. Не можете да използвате прост оператор за присвояване, защото променливата е маркирана final. Нека работим от края назад. Както се случва, Systemкласът има метода, от който се нуждаем: setOut(). Той взема PrintStreamобект и го задава като дестинация за изход. Точно това ни трябва! Остава само да създадете 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"));
       /* Save the current value of System.out in a separate variable so that later 
       we can switch back to console output */ 

       PrintStream console = System.out; 
       // Assign a new value to System.out 
       System.setOut(filePrintStream); 
       System.out.println("This line will be written to the text file"); 

       // Restore the old value of System.out 
       System.setOut(console); 
       System.out.println("But this line will be output to the console!"); 
   } 
}
В резултат на това първият низ се записва в текстовия файл, а вторият се показва в конзолата :) Можете да копирате този code във вашата IDE и да го стартирате. Отворете текстовия файл и ще видите, че низът е записан успешно там :) С това урокът ни приключи. Днес си припомнихме How да работим с потоци и читатели. Припомнихме си с Howво се различават един от друг и научихме за някои нови възможности на System.out, които сме използвали в почти всеки урок :) До следващите уроци!

Още четене:

Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION