JavaRush /Java-Blog /Random-DE /Wozu dient die PrintStream-Klasse?

Wozu dient die PrintStream-Klasse?

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute sprechen wir über die Klasse PrintStreamund alles, was sie kann. Wozu dient die PrintStream-Klasse? - 1Eigentlich kennen Sie bereits zwei Methoden der Klasse PrintStream. print()Dies sind die und- Methoden println(), die Sie wahrscheinlich jeden Tag verwenden :) Da eine Variable System.outein Objekt ist , rufen Sie PrintStreambeim Aufrufen einer Methode System.out.println()eine Methode dieser bestimmten Klasse auf. Der allgemeine Zweck der Klasse PrintStreambesteht darin, Informationen an einen Stream auszugeben. Diese Klasse verfügt über mehrere Konstruktoren. Hier sind einige der häufigsten:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Wie Sie sehen, können wir dem Konstruktor des Objekts PrintStreambeispielsweise den Namen der Datei übergeben, in die wir die Daten ausgeben möchten. Oder alternativ das Objekt selbst File. Sehen wir uns anhand von Beispielen an, wie das funktioniert:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

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

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
Dieser Code erstellt eine Datei auf dem Desktop test.txt(sofern sie dort noch nicht vorhanden ist) und schreibt booleandort nacheinander unsere Nummer, Zeichenfolge und -Variable. Hier ist der Inhalt unserer Datei, nachdem das Programm ausgeführt wurde:

222
Hello world!
false
Wie oben erwähnt, ist es nicht erforderlich, das Dateiobjekt selbst zu übergeben File. Sie müssen lediglich den Pfad dazu im Konstruktor angeben:
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

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

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
Dieser Code macht dasselbe wie der vorherige. Eine weitere interessante Methode ist die printf()formatierte String-Ausgabe. Was bedeutet „formatierte Zeichenfolge“? Zur Erläuterung gebe ich ein Beispiel:
import java.io.IOException;
import java.io.PrintStream;

public class Main {

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

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("I'm robot!");

       printStream.printf("My name is %s, my age is %d!", "Amigo", 18);

       printStream.close();

   }
}
Anstatt den Namen und das Alter unseres Roboters explizit in einer Zeile aufzuschreiben, scheinen wir hier mithilfe von Zeigern %sund „Freiraum“ für diese Informationen zu lassen %d. Und wir übergeben die Daten, die an diesen Stellen sein sollten, als Parameter. In unserem Fall ist das die Zeichenfolge „ Amigo “ und die Zahl 18. Wir könnten beispielsweise ein weiteres Leerzeichen erstellen: sagen wir %b, und einen weiteren Parameter übergeben. Wofür ist das? Erstens, um die Flexibilität zu erhöhen. Wenn Ihr Programm häufig eine Willkommensnachricht anzeigen muss, müssen Sie den erforderlichen Text für jeden neuen Roboter manuell eingeben. Sie können diesen Text nicht einmal in eine Konstante einfügen: Jeder hat einen anderen Namen und ein anderes Alter! Mit der neuen Methode können Sie jedoch einen String mit einer Begrüßung an eine Konstante ausgeben und bei Bedarf einfach die Parameter in der Methode ändern printf().
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s, my age is %d!";

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

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("We are robots!");

       printStream.printf(GREETINGS_MESSAGE, "Amigo", 18);
       printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35);
       printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35);

       printStream.close();
   }
}

System.in-Spoofing

In dieser Vorlesung werden wir „das System bekämpfen“ und lernen, wie man eine Variable ersetzt System.inund die Systemausgabe an die Stelle umleitet, die wir brauchen. Wozu dient die PrintStream-Klasse? - 2Sie haben vielleicht vergessen, was es ist System.in, aber kein JavaRush-Schüler wird diese Konstruktion jemals vergessen:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(like System.out) ist eine statische Klassenvariable System. Aber im Gegensatz zu System.out, gehört es zu einer anderen Klasse, nämlich zu InputStream. Standardmäßig System.inist dies ein Thread, der Daten vom Systemgerät – der Tastatur – liest. Allerdings können wir, wie im Fall von System.out, die Datenquelle ersetzen und das Lesen erfolgt nicht über die Tastatur, sondern an der Stelle, die wir brauchen! Schauen wir uns ein Beispiel an:
import java.io.*;

public class Main {

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

       String greetings = "Hallo! Меня зовут Амиго!\nЯ изучаю Java на сайте JavaRush.\nОднажды я стану крутым программистом!\n";
       byte[] bytes = greetings.getBytes();

       InputStream inputStream = new ByteArrayInputStream(bytes);

       System.setIn(inputStream);

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }

   }
}
Was haben wir also gemacht? Normalerweise System.inan die Tastatur „gebunden“. Aber wir möchten nicht, dass die Daten von der Tastatur gelesen werden: Lassen Sie sie aus einer normalen Textzeile lesen! Wir haben einen String erstellt und ihn als Byte-Array erhalten. Warum brauchen wir Bytes? Tatsache ist, dass es sich InputStreamum eine abstrakte Klasse handelt und wir keine Instanz davon erstellen können. Sie müssen eine Klasse aus ihren Erben auswählen. Wir können zum Beispiel nehmen ByteArrayInputStream. Es ist einfach und schon der Name macht deutlich, wie es funktioniert: Seine Datenquelle ist ein Byte-Array. Also erstellen wir dasselbe Byte-Array und übergeben es an unseren Konstruktor stream, der die Daten liest. Eigentlich ist schon alles fertig! Jetzt müssen wir nur noch die Methode verwenden System.setIn(), um den Wert der Variablen explizit festzulegen in. Im Fall von outwar es, wie Sie sich erinnern, offensichtlich auch unmöglich, den Wert der Variablen festzulegen: Sie mussten eine spezielle Methode verwenden setOut(). InputStreamNachdem wir die von uns erstellte Variable zugewiesen haben System.in, müssen wir prüfen, ob unsere Idee funktioniert hat. Ein alter Freund wird uns dabei helfen BufferedReader. In einer normalen Situation würde dieser Code dazu führen, dass eine Konsole in Ihrer Intellij-IDEa geöffnet wird und die von Ihnen über die Tastatur eingegebenen Daten von dort gelesen werden.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }
Aber wenn Sie es jetzt ausführen, werden Sie sehen, dass unser Text aus dem Programm einfach auf der Konsole ausgegeben wird, es erfolgt kein Vorlesen über die Tastatur. Wir haben die Datenquelle geändert, jetzt ist es nicht mehr die Tastatur, sondern unser String! Es ist so einfach und unkompliziert :) In der heutigen Vorlesung haben wir eine neue Klasse kennengelernt und einen neuen kleinen „Hack“ für die Arbeit mit I/O angeschaut. Zeit, zum Kurs zurückzukehren und einige Probleme zu lösen :) Wir sehen uns in der nächsten Vorlesung!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION