CodeGym /Java-Blog /Random-DE /Üben Sie die Arbeit mit den Klassen BufferedReader und In...
Autor
Jesse Haniel
Lead Software Architect at Tribunal de Justiça da Paraíba

Üben Sie die Arbeit mit den Klassen BufferedReader und InputStreamReader

Veröffentlicht in der Gruppe Random-DE
Hallo! Die heutige Lektion wird der Einfachheit halber in zwei Teile unterteilt. Wir werden einige alte Themen wiederholen, die wir zuvor angesprochen haben, und wir werden einige neue Funktionen in Betracht ziehen :) Beginnen wir mit dem ersten. Du hast bereits einen Kurs besucht, wie BufferedReaderso oft. Ich hoffe, Sie hatten keine Zeit, diese Aussage zu vergessen:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Bevor Sie weiterlesen, versuchen Sie sich daran zu erinnern, wofür jede Komponente – System.in, InputStreamReader, BufferedReader– verantwortlich ist und warum sie benötigt wird. Erinnerst du dich? Wenn nicht, keine Sorge. :) Wenn Sie etwas vergessen haben, lesen Sie diese Lektion noch einmal , die den Lesekursen gewidmet ist. Wir erinnern uns kurz daran, was jeder von ihnen kann. System.in— Dies ist ein Stream zum Empfangen von Daten von der Tastatur.  Im Prinzip würde es allein ausreichen, um die Logik zu implementieren, die zum Lesen von Text erforderlich ist. Aber wie Sie sich erinnern werden, System.inkönnen nur Bytes gelesen werden, 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 kyrillischen Buchstaben „Й“ eingeben, lautet die Ausgabe:

Й
208
153
10 
Kyrillische Zeichen belegen 2 Bytes im Speicher und werden auf dem Bildschirm angezeigt. Die Zahl 10 ist die dezimale Darstellung eines Zeilenvorschubzeichens, also vom Drücken der Eingabetaste. Das Lesen von Bytes ist so ein Vergnügen, daher System.inist die Verwendung nicht sehr praktisch. Um kyrillische (und andere) Buchstaben richtig lesen zu können, 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); 
       } 
   } 
} 
Wir geben den gleichen Buchstaben „Й“ ein, aber das Ergebnis ist dieses Mal anders:

Й 
1049 
10
InputStreamReaderhat zwei Bytes (208 und 153) in die einzelne Zahl 1049 umgewandelt. Das ist es, was es bedeutet, Zeichen zu lesen. 1049 entspricht dem kyrillischen Buchstaben „Й“. Wir können uns leicht davon überzeugen, dass dies wahr ist:

public class Main { 

   public static void main(String[] args) throws IOException { 
       char x = 1049; 
       System.out.println(x); 
   } 
} 
Konsolenausgabe:

Й
Und wie forBufferedReader(und im Allgemeinen BufferedAnythingYouWant) werden gepufferte Klassen verwendet, um die Leistung zu optimieren. Der Zugriff auf eine Datenquelle (Datei, Konsole, Webressource) ist im Hinblick auf die Leistung recht aufwändig. Um die Anzahl der Zugriffe zu reduzieren, BufferedReaderwerden die Daten daher in einem speziellen Puffer gelesen und gesammelt und von dort abgerufen. Dadurch wird die Anzahl der Zugriffe auf die Datenquelle drastisch reduziert – möglicherweise um mehrere Größenordnungen! Ein weiteres BufferedReaderMerkmal von und sein Vorteil gegenüber dem gewöhnlichen InputStreamReaderist die äußerst hilfreiche readLine()Methode, die ganze Datenzeilen liest, nicht einzelne Zahlen. Das ist natürlich besonders praktisch, wenn es um große Texte geht. So sieht das Lesen von Zeilen aus:

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
Üben Sie die Arbeit mit den Klassen BufferedReader und InputStreamReader – 2Natürlich BufferedReaderist es sehr flexibel. Sie sind nicht auf die Arbeit mit der Tastatur beschränkt. Sie können beispielsweise Daten direkt aus dem Web lesen, indem Sie einfach die erforderliche URL an einen 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 Dateipfad ü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(); 
   } 
}

Ersetzen von System.out

Werfen wir nun einen Blick auf eine interessante Funktion, die wir bisher noch nicht angesprochen haben. Wie Sie sich sicherlich erinnern, Systemverfügt die Klasse über zwei statische Felder – System.inund  System.out. Diese Zwillingsbrüder sind Stream-Objekte. System.inist ein InputStream. Und System.out ist ein PrintStream. Im Moment werden wir darüber reden  System.out. SystemWenn wir uns den Quellcode der Klasse ansehen , sehen wir Folgendes:

public final class System { 
……………... 
public final static PrintStream out = null; 
 ………… 
} 
Somit  System.out  handelt es sich einfach um eine gewöhnliche statische Variable derSystem Klasse. Daran ist nichts Magisches :) Die outVariable ist eine PrintStreamReferenz. Hier ist eine interessante Frage: System.out.println()Warum genau geht die Ausgabe bei der Ausführung an die Konsole und nicht woanders hin? Und lässt sich das irgendwie ändern? Angenommen, wir möchten Daten von der Konsole lesen und in eine Textdatei schreiben. Ist es möglich, dies irgendwie zu implementieren, indem einfach  System.outstatt zusätzlicher Reader- und Writer-Klassen verwendet wird? Tatsächlich ist es so :) Und wir können es tun, obwohl die System.outVariable mit dem finalModifikator markiert ist!  Üben Sie die Arbeit mit den Klassen BufferedReader und InputStreamReader – 3Was brauchen wir also, um dies zu erreichen? Zunächst benötigen wir ein neues PrintStreamObjekt, das das aktuelle ersetzt. Das aktuelle Objekt, festgelegt inSystemDie Klasse dient standardmäßig nicht unseren Zwecken: Sie verweist auf die Konsole. Sie müssen eine neue erstellen, die auf eine Textdatei verweist – das „Ziel“ für unsere Daten. Zweitens müssen wir verstehen, wie wir der System.outVariablen einen neuen Wert zuweisen. Sie können keinen einfachen Zuweisungsoperator verwenden, da die Variable mit markiert ist final. Arbeiten wir vom Ende aus rückwärts. Zufälligerweise Systemverfügt die Klasse über die Methode, die wir benötigen: setOut(). Es nimmt ein PrintStreamObjekt und legt es als Ziel für die Ausgabe fest. Genau das brauchen wir! PrintStreamEs bleibt nur noch, ein Objekt zu erstellen . Auch das geht ganz einfach:

PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Der vollständige 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"));
       /* 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!"); 
   } 
}
Dadurch wird die erste Zeichenfolge in die Textdatei geschrieben und die zweite in der Konsole angezeigt :) Sie können diesen Code in Ihre IDE kopieren und ausführen. Öffnen Sie die Textdatei und Sie werden sehen, dass die Zeichenfolge dort erfolgreich geschrieben wurde :) Damit ist unsere Lektion zu Ende. Heute haben wir uns daran erinnert, wie man mit Streams und Lesern arbeitet. Wir erinnerten uns daran, wie sie sich voneinander unterscheiden, und lernten einige neue Fähigkeiten von kennen System.out, die wir in fast jeder Lektion genutzt haben :) Bis zu den nächsten Lektionen!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION