JavaRush /Java-Blog /Random-DE /Üben Sie die Arbeit mit den Klassen BufferedReader und In...

Üben Sie die Arbeit mit den Klassen BufferedReader und InputStreamReader

Veröffentlicht in der Gruppe Random-DE
Hallo! Der heutige Vortrag gliedert sich in zwei Teile. Wir werden einige der alten Themen wiederholen, die wir bereits zuvor angesprochen haben, und uns einige neue Funktionen ansehen :) Üben Sie die Arbeit mit den Klassen BufferedReader und InputStreamReader – 1Beginnen wir mit dem ersten. Wiederholung ist die Mutter des Lernens :) Sie haben bereits eine Klasse wie verwendet BufferedReader. Ich hoffe, Sie haben diesen Befehl noch nicht vergessen:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Bevor Sie weiterlesen, versuchen Sie sich daran zu erinnern, wofür die einzelnen Komponenten ( System.in, InputStreamReader, BufferedReader) verantwortlich sind und wofür sie benötigt werden. Passiert? Wenn nicht, machen Sie sich keine Sorgen :) Wenn Sie zu diesem Zeitpunkt etwas vergessen haben, lesen Sie diesen Leservortrag noch einmal. Erinnern wir uns kurz daran, was jeder von ihnen tun kann. System.inist ein Thread zum Empfangen von Daten von der Tastatur. Um die Logik des Textlesens umzusetzen, würde uns im Prinzip einer genügen. Aber wie Sie sich erinnern, System.inkann es nur Bytes lesen, keine Zeichen:
public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Wenn wir diesen Code ausführen und den Buchstaben „Y“ in die Konsole eingeben, sieht die Ausgabe so aus:

Й
208
153
10
Kyrillische Zeichen belegen 2 Bytes im Speicher, die auf dem Bildschirm angezeigt werden (und die Zahl 10 ist die Byte-Darstellung eines Zeilenumbruchs, d. h. Drücken der Eingabetaste). Das Lesen von Bytes ist so ein Vergnügen, dass es System.inunbequem sein wird, es in seiner reinen Form zu verwenden. Um kyrillische (und nicht nur) Buchstaben für jedermann verständlich zu lesen, verwenden wir InputStreamReaderals Wrapper:
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);
       }
   }
}
Wenn wir den gleichen Buchstaben „Y“ in die Konsole eingeben, wird das Ergebnis dieses Mal anders ausfallen:

Й
1049
10
InputStreamReaderKonvertierte die beiden gelesenen Bytes (208, 153) in eine einzelne Zahl 1049. Dies ist das Lesen nach Zeichen. 1049 entspricht dem Buchstaben „Y“, was leicht überprüft werden kann:
public class Main {

   public static void main(String[] args) throws IOException {

       char x = 1049;
       System.out.println(x);
   }
}
Konsolenausgabe:

Й
Nun, was BufferedReader'a' (und im Allgemeinen - BufferedAnything) betrifft, werden gepufferte Klassen verwendet, um die Leistung zu optimieren. Der Zugriff auf eine Datenquelle (Datei, Konsole, Ressource im Internet) ist im Hinblick auf die Leistung ein ziemlich kostspieliger Vorgang. Um die Anzahl solcher Aufrufe zu reduzieren, BufferedReaderwerden daher Daten in einem speziellen Puffer gelesen und gesammelt, von wo aus wir sie später empfangen können. Dadurch wird die Anzahl der Aufrufe der Datenquelle um ein Vielfaches oder sogar Zehnfaches reduziert! Ein weiteres zusätzliches Merkmal von BufferedReader„a“ und sein Vorteil gegenüber „regular InputStreamReader“ ist die äußerst nützliche Methode readLine(), die Daten als ganze Zeichenfolgen und nicht als einzelne Zahlen liest. Dies erhöht natürlich den Komfort erheblich, wenn beispielsweise große Texte implementiert werden. So würde das Lesen einer Zeile aussehen:
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
Üben Sie die Arbeit mit den Klassen BufferedReader und InputStreamReader – 2Natürlich BufferedReaderhandelt es sich um einen sehr flexiblen Mechanismus, mit dem Sie nicht nur mit der Tastatur arbeiten können. Sie können Daten beispielsweise direkt aus dem Internet lesen, indem Sie einfach die erforderliche URL an den Reader übergeben:
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();
   }
}
Sie können Daten aus einer Datei lesen, indem Sie den Pfad dazu übergeben:
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();
   }
}

Ersetzung von System.out

Schauen wir uns nun eine interessante Möglichkeit an, die wir bisher noch nicht angesprochen haben. Wie Sie sich wahrscheinlich erinnern, Systemgibt es in der Klasse zwei statische Felder – System.inund System.out. Diese Zwillingsbrüder sind Thread-Klassenobjekte. System.in- abstrakte Klasse InputStream. Eine System.outKlasse PrintStream. Jetzt werden wir speziell darüber sprechen System.out. Wenn wir uns den Quellcode der Klasse ansehen System, sehen wir Folgendes:
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
Also System.outnur eine reguläre statische KlassenvariableSystem . Da ist keine Magie drin :) Die Variable outgehört zur Klasse PrintStream. Hier ist eine interessante Frage: Warum System.out.println()erscheint die Ausgabe beim Ausführen von Code in der Konsole und nicht woanders? Und kann man das irgendwie ändern? Wir möchten beispielsweise Daten von der Konsole lesen und in eine Textdatei schreiben. Ist es möglich, eine solche Logik irgendwie zu implementieren, ohne zusätzliche Lese- und Schreibklassen zu verwenden, sondern einfach System.out? Immer noch wie möglich :) Und obwohl die Variable System.outdurch einen Modifikator gekennzeichnet ist final, können wir es trotzdem tun! Üben Sie die Arbeit mit den Klassen BufferedReader und InputStreamReader – 3Was brauchen wir also dafür? Erstens benötigen wir ein neues Klassenobjekt PrintStreamanstelle des aktuellen. SystemDas aktuelle , standardmäßig in der Klasse installierte Objekt passt nicht zu uns: Es zeigt auf die Konsole. Wir müssen eine neue Datei erstellen, die auf eine Textdatei als „Ziel“ für unsere Daten verweist. Zweitens müssen Sie verstehen, wie Sie einer Variablen einen neuen Wert zuweisen System.out. Das kann man nicht einfach so machen, denn es ist markiert final. Fangen wir am Ende an. Die Klasse Systementhält genau die Methode, die wir brauchen – setOut(). Es nimmt ein Objekt als Eingabe PrintStreamund legt es als Ausgabepunkt fest. Genau das, was wir brauchen! Jetzt muss nur noch das Objekt erstellt werden PrintStream. Auch das geht ganz einfach:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Der gesamte Code sieht folgendermaßen aus:
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       /*Сохраним текущее Bedeutung System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое Bedeutung
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое Bedeutung
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
Als Ergebnis wird die erste Zeile in eine Textdatei geschrieben und die zweite an die Konsole ausgegeben :) Sie können diesen Code in Ihre IDE kopieren und ausführen. Wenn Sie die Textdatei öffnen, sehen Sie, dass die erforderliche Zeile dort erfolgreich geschrieben wurde :) Damit ist die Vorlesung abgeschlossen. Heute haben wir uns daran erinnert, wie man mit Streams und Readern arbeitet, haben uns daran erinnert, wie sie sich voneinander unterscheiden und haben neue Funktionen kennengelernt System.out, die wir in fast jeder Lektion verwendet haben :) Wir sehen uns in den nächsten Vorlesungen!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION