JavaRush /Blog Java /Random-PL /Do czego służy klasa PrintStream?

Do czego służy klasa PrintStream?

Opublikowano w grupie Random-PL
Cześć! Dzisiaj porozmawiamy o klasie PrintStreami wszystkim, co potrafi. Do czego służy klasa PrintStream? - 1Właściwie znasz już dwie metody tej klasy PrintStream. Są to metody print()i println(), których prawdopodobnie używasz na co dzień :) Ponieważ zmienna System.outjest obiektem PrintStream, wywołując metodę System.out.println(), wywołujesz metodę tej konkretnej klasy. Ogólnym celem klasy PrintStreamjest wysyłanie informacji do pewnego strumienia. Ta klasa ma kilka konstruktorów. Oto kilka najczęstszych:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Jak widać do konstruktora obiektu możemy przekazać PrintStreamnp. nazwę pliku, do którego chcemy wyprowadzić dane. Lub alternatywnie sam obiekt File. Przyjrzyjmy się, jak to działa na przykładach:
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);
   }
}
Ten kod utworzy plik na pulpicie test.txt(jeśli jeszcze nie istnieje) i zapisze booleantam po kolei nasz numer, ciąg znaków i zmienną -. Oto zawartość naszego pliku po uruchomieniu programu:

222
Hello world!
false
Jak powiedzieliśmy powyżej, nie jest konieczne przekazywanie samego obiektu pliku File. Wystarczy podać ścieżkę do niego w konstruktorze:
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);
   }
}
Ten kod zrobi to samo, co poprzedni. Inną interesującą metodą, której warto się przyjrzeć, printf()jest sformatowany ciąg wyjściowy. Co oznacza „sformatowany ciąg znaków”? Aby wyjaśnić, podam przykład:
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();

   }
}
Tutaj, zamiast wprost zapisywać w jednym wierszu imię i wiek naszego robota, wydaje się, że zostawiamy „wolne miejsce” na te informacje za pomocą wskaźników %si %d. I przekazujemy dane, które powinny znajdować się w tych miejscach jako parametry. W naszym przypadku jest to ciąg znaków „ Amigo ” i liczba 18. Moglibyśmy np. utworzyć kolejną spację: powiedzieć, %bi przekazać kolejny parametr. Po co to jest? Przede wszystkim zwiększyć elastyczność. Jeśli Twój program musi często wyświetlać wiadomość powitalną, będziesz musiał ręcznie wprowadzić wymagany tekst dla każdego nowego robota. Nie będziesz nawet w stanie umieścić tego tekstu w stałej: wszyscy mają inne imiona i wiek! Ale używając nowej metody, możesz wyprowadzić ciąg znaków z powitaniem na stałą i, jeśli to konieczne, po prostu zmienić parametry metody 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();
   }
}

Podszywanie się pod system

W tym wykładzie będziemy „walczyć z systemem” i nauczymy się, jak zastąpić zmienną System.ini przekierować wyjście systemu tam, gdzie potrzebujemy. Do czego służy klasa PrintStream - 2Być może zapomniałeś, co to jest System.in, ale żaden student JavaRush nigdy nie zapomni tej konstrukcji:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(jak System.out) jest statyczną zmienną klasy System. Ale w przeciwieństwie do System.out, należy do innej klasy, a mianowicie do InputStream. Domyślnie System.injest to wątek odczytujący dane z urządzenia systemowego – klawiatury. Jednak podobnie jak w przypadku System.outmożemy podmienić źródło danych, a odczyt nastąpi nie z klawiatury, a z miejsca, które potrzebujemy! Spójrzmy na przykład:
import java.io.*;

public class Main {

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

       String greetings = "Cześć! Меня зовут Амиго!\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);
       }

   }
}
Co więc zrobiliśmy? Zwykle System.in„przywiązany” do klawiatury. Ale nie chcemy, żeby dane były odczytywane z klawiatury: niech czytane są ze zwykłej linijki tekstu! Stworzyliśmy ciąg znaków i otrzymaliśmy go jako tablicę bajtów. Dlaczego potrzebujemy bajtów? Faktem jest, że InputStreamjest to klasa abstrakcyjna i nie możemy stworzyć jej instancji. Będziesz musiał wybrać jakąś klasę spośród jej spadkobierców. Możemy wziąć np ByteArrayInputStream. Jest to proste i już sama nazwa wyjaśnia, jak to działa: jego źródłem danych jest tablica bajtów. Tworzymy więc tę samą tablicę bajtów i przekazujemy ją naszemu konstruktorowi stream, który odczyta dane. Właściwie wszystko jest już gotowe! Teraz wystarczy użyć tej metody, System.setIn()aby jawnie ustawić wartość zmiennej in. W przypadku out, jak pamiętasz, wyraźnie niemożliwe było również ustawienie wartości zmiennej: trzeba było użyć specjalnej metody setOut(). Po przypisaniu utworzonej przez nas InputStreamzmiennej System.inmusimy sprawdzić, czy nasz pomysł zadziałał. Pomoże nam w tym stary przyjaciel - BufferedReader. W normalnej sytuacji ten kod spowodowałby otwarcie konsoli w Twoim Intellij IDEa i stamtąd odczytane zostałyby dane wprowadzone z klawiatury.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

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

           System.out.println(str);
       }
Ale kiedy go teraz uruchomisz, zobaczysz, że nasz tekst z programu zostanie po prostu wypisany na konsolę, nie będzie odczytu z klawiatury. Zmieniliśmy źródło danych, teraz to nie klawiatura, ale nasz ciąg! To takie łatwe i proste :) Na dzisiejszym wykładzie zapoznaliśmy się z nowymi zajęciami i przyjrzeliśmy się nowemu małemu „hackowi” do pracy z wejściami/wyjściami. Czas wrócić do kursu i rozwiązać kilka problemów :) Do zobaczenia na kolejnym wykładzie!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION