JavaRush /Java-Blog /Random-DE /Lesen von der Tastatur – „Leser“

Lesen von der Tastatur – „Leser“

Veröffentlicht in der Gruppe Random-DE
Hallo! In Vorlesungen und Aufgaben haben wir gelernt, wie man Daten an die Konsole ausgibt und umgekehrt – Daten von der Tastatur liest. Lesen von der Tastatur – „Leser“ – 1Sie haben sogar gelernt, dafür eine komplexe Konstruktion zu verwenden:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Aber eine Frage haben wir immer noch nicht beantwortet.

Wie funktioniert das überhaupt?

Tatsächlich existiert meistens kein Programm für sich allein. Es kann mit anderen Programmen, Systemen, dem Internet usw. kommunizieren. Mit dem Wort „kommunizieren“ meinen wir zunächst einmal „Daten austauschen“. Das heißt, Sie erhalten einige Daten von außen und senden im Gegenteil Ihre eigenen Daten irgendwohin. Es gibt viele Beispiele für den Datenaustausch zwischen Programmen, auch im Alltag. Anstatt sich zu registrieren, können Sie sich auf vielen Websites auch mit Ihrem Facebook- oder Twitter-Konto anmelden. In dieser Situation tauschen zwei Programme, beispielsweise Twitter und die Website, auf der Sie sich registrieren möchten, die erforderlichen Daten miteinander aus, woraufhin Sie das Endergebnis sehen – eine erfolgreiche Autorisierung. Der Begriff „ Flow “ wird häufig verwendet, um den Prozess des Datenaustauschs in der Programmierung zu beschreiben . Woher kommt dieser Name überhaupt? „Flow“ wird eher mit einem Fluss oder Bach als mit Programmierung in Verbindung gebracht. Tatsächlich ist dies nicht ohne Grund :) Ein Stream ist im Wesentlichen ein sich bewegendes Datenelement. Das heißt, beim Programmieren „fließt“ nicht Wasser durch den Strom, sondern Daten in Form von Bytes und Zeichen. Aus einem Datenstrom können wir Daten in Teilen empfangen und etwas damit machen. Lassen Sie uns noch einmal die Analogie zum „fließenden Wasser“ verwenden: Sie können Wasser aus einem Fluss schöpfen, um Suppe zu kochen, ein Feuer zu löschen oder Blumen zu gießen. Mithilfe von Streams können Sie mit jeder Datenquelle arbeiten: dem Internet, dem Dateisystem Ihres Computers oder etwas anderem – es spielt keine Rolle. Streams sind ein universelles Werkzeug. Sie ermöglichen es dem Programm, Daten von überall zu empfangen (eingehende Streams) und sie überall hin zu senden (ausgehende Streams). Ihre Aufgabe besteht darin, Daten an einem Ort aufzunehmen und an einen anderen zu senden. Streams werden in zwei Typen unterteilt:
  1. Eingehender Stream ( Eingabe ) – wird zum Empfangen von Daten verwendet
  2. Ausgehender Stream ( Ausgabe ) – zum Senden von Daten.
Der eingehende Datenfluss in Java wird in der Klasse InputStreamund der ausgehende Datenfluss in der Klasse implementiert OutputStream. Es gibt aber noch eine andere Möglichkeit, Threads aufzuteilen. Sie werden nicht nur in eingehend und ausgehend, sondern auch in Byte und Zeichen unterteilt . Hier ist die Bedeutung ohne Erklärung klar: Ein Bytestrom überträgt Informationen in Form einer Reihe von Bytes, und ein Zeichenstrom überträgt Informationen in Form einer Reihe von Zeichen. In diesem Vortrag gehen wir detailliert auf eingehende Streams ein. Und ich werde am Ende Informationen zu ausgehenden Links anhängen, und Sie können es selbst lesen :) Also, unser Code:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Sie dachten wahrscheinlich schon beim Lesen der Vorträge, dass es ziemlich gruselig aussah? :) Aber das gilt nur, bis wir herausgefunden haben, wie das Ding funktioniert. Lass es uns jetzt beheben! Fangen wir am Ende an. System.inist ein Objekt der Klasse InputStream, über die wir am Anfang gesprochen haben. Dies ist ein eingehender Stream, der an das Systemeingabegerät – die Tastatur – gebunden ist. Du kennst ihn übrigens indirekt. Schließlich nutzen Sie bei Ihrer Arbeit oft seinen „Kollegen“ – System.out! - Dies ist ein Systemdaten -AusgabestreamSystem.out , er wird für die Ausgabe an die Konsole auf die gleiche Weise verwendet , die Sie ständig verwenden :) - ein Stream zum Senden von Daten an die Konsole und - zum Empfangen von Daten von der Tastatur. Es ist ganz einfach :) Außerdem: Um Daten von der Tastatur auszulesen, können wir auf diese große Konstruktion verzichten und einfach schreiben: ; System.out.println()System.outSystem.inSystem.in.read()
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
In der Klasse InputStream(und System.inich möchte Sie daran erinnern, ist sie ein Objekt der Klasse InputStream) gibt es eine Methode read(), mit der Sie Daten lesen können. Ein Problem: Es liest Bytes , keine Zeichen . Versuchen wir, den russischen Buchstaben „Ya“ von der Tastatur zu lesen. Konsolenausgabe:
Я
208
175
10
Russische Buchstaben belegen 2 Byte im Speicher des Computers (im Gegensatz zu englischen Buchstaben, die nur 1 Byte belegen). In diesem Fall wurden 3 Bytes aus dem Stream gelesen: Die ersten beiden stellen unseren Buchstaben „I“ dar und das andere ist der Zeilenumbruch (Enter). Daher passt die Option „nackt“ System.innicht zu uns. Menschen können (mit seltenen Ausnahmen!) keine Bytes lesen. Hier kommt uns die nächste Klasse zu Hilfe - InputStreamReader! Lassen Sie uns herausfinden, was für ein Tier das ist.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Wir geben den Stream System.inan den weiter InputStreamReader. Wenn man seinen Namen ins Russische übersetzt, sieht im Allgemeinen alles offensichtlich aus – „Leser eingehender Streams“. Eigentlich ist es genau das, wofür es ist! Wir erstellen ein Klassenobjekt InputStreamReaderund übergeben ihm einen eingehenden Stream, aus dem es Daten lesen soll. In diesem Fall...
new InputStreamReader(System.in)
...wir sagen es: „Sie werden Daten aus dem Systemeingabestrom (Tastatur) lesen.“ Aber das ist nicht seine einzige Funktion! InputStreamReaderempfängt nicht nur Daten aus dem Stream. Außerdem werden Byteströme in Zeichenströme konvertiert . Mit anderen Worten, Sie müssen sich nicht mehr darum kümmern, die gelesenen Daten von der „Computersprache“ in die „menschliche“ Sprache zu übersetzen – InputStreamReaderes erledigt alles für Sie. InputStreamReaderNatürlich können Daten nicht nur von der Konsole, sondern auch von anderen Orten gelesen werden. Zum Beispiel aus der Datei:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
Hier haben wir einen eingehenden Datenstrom erstellt FileInputStream(dies ist eine der Varianten InputStream), den Pfad zur Datei darin übergeben und den Strom selbst übergeben InputStreamReader. Jetzt können Daten aus dieser Datei gelesen werden, sofern die Datei in diesem Pfad natürlich vorhanden ist. Um Daten zu lesen (egal von wo, von der Konsole, einer Datei oder irgendwo anders), InputStreamReaderverwendet die Klasse auch die read(). Was ist der Unterschied zwischen System.in.read()und InputStreamReader.read()? Versuchen wir, denselben Buchstaben „I“ mit zu zählen InputStreamReader. Ich möchte Sie daran erinnern, dass ich Folgendes dachte System.in.read():
Я
208
175
10
Wie kann er den gleichen Job machen 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);
       }
   }
}
Konsolenausgabe:
Я
1071
10
Der Unterschied ist sofort sichtbar. Das letzte Byte – für Zeilenumbrüche – blieb unverändert (die Zahl 10), aber der gelesene Buchstabe „I“ wurde in einen einzelnen Code „1071“ umgewandelt. Das ist Lesen nach Symbolen! Wenn Sie plötzlich nicht mehr glauben, dass Code 1071 den Buchstaben „I“ bedeutet, können Sie dies leicht überprüfen :)
import java.io.IOException;

public class Main {

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

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

Я
Aber wenn InputStreamReaderes so gut ist, warum brauchen Sie dann mehr BufferedReader? InputStreamReaderkann sowohl Daten lesen als auch Bytes in Zeichen umwandeln – was brauchen wir sonst noch? Warum ein anderer Leser? :/ Die Antwort ist ganz einfach – für mehr Produktivität und mehr Komfort . Beginnen wir mit der Leistung. Beim Lesen von Daten verwendet BufferedReader einen speziellen Bereich – einen Puffer, in den die gelesenen Zeichen „hinzugefügt“ werden. Wenn wir diese Zeichen im Programm benötigen, werden sie daher aus dem Puffer und nicht direkt aus der Datenquelle (Tastatur, Datei usw.) entnommen, was eine Menge Ressourcen spart. Um zu verstehen, wie das funktioniert, stellen Sie sich zum Beispiel die Arbeit eines Kuriers in einem großen Unternehmen vor. Der Kurier sitzt im Büro und wartet darauf, dass ihm Pakete zur Zustellung gebracht werden. Jedes Mal, wenn er ein neues Paket erhält, kann er sofort losfahren. Aber es kann tagsüber viele Pakete geben, und er muss jedes Mal zwischen dem Büro und den Adressen hin- und herfahren. Stattdessen stellte der Kurier im Büro einen Briefkasten auf, in den jeder seine Pakete legen konnte. Jetzt kann der Kurier in aller Ruhe das Paket entgegennehmen und zu den Adressen gehen – er spart viel Zeit, da er nicht jedes Mal ins Büro zurückkehren muss. Die Box in diesem Beispiel ist genau der Puffer und das Büro ist die Datenquelle. Für einen Kurier ist es viel einfacher, einen Brief bei der Zustellung aus einem gemeinsamen Briefkasten zu nehmen, als jedes Mal ins Büro zu gehen. Es wird auch Benzin gespart. Das Gleiche gilt für ein Programm – es ist viel weniger ressourcenintensiv, Daten aus dem Puffer zu entnehmen, als jedes Mal auf die Datenquelle zuzugreifen. Deshalb funktioniert BufferedReader+ InputStreamReaderschneller als nur InputStreamReader. Wir haben die Leistung geklärt, aber was ist mit der Bequemlichkeit? Der Hauptvorteil besteht darin, dass BufferedReaderDaten nicht nur zeichenweise gelesen werden können (obwohl read()es auch eine Methode für diesen Zweck gibt), sondern auch ganze Zeilen! Dies geschieht mit dem readLine();
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(„Wir lesen diese Zeile von der Tastatur:“);
       System.out.println(s);
   }
}
Konsolenausgabe:
JavaRush ist die beste Seite, um Java zu lernen!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
Dies ist besonders nützlich, wenn große Datenmengen gelesen werden. Es können noch ein oder zwei Textzeilen Zeichen für Zeichen gelesen werden. Aber „Krieg und Frieden“ buchstabenweise zu zählen, wird etwas problematisch sein :) Jetzt ist Ihnen die Arbeit der Threads viel klarer geworden. Zum weiteren Studium finden Sie hier eine zusätzliche Quelle: Hier können Sie mehr über eingehende und ausgehende Flüsse lesen. Videorezension BufferedReadervon einem unserer Studenten. Ja, ja, unsere Schüler lernen nicht nur selbst, sondern nehmen auch Lehrvideos für andere auf! Vergessen Sie nicht, unseren Kanal zu liken und zu abonnieren :)
Es ist besser, sich gleich zu Beginn Ihres Studiums daran zu gewöhnen, offizielle Unterlagen zu lesen. Es ist die wichtigste Wissensquelle über die Sprache und die meisten Antworten sind immer dort zu finden.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION