CodeGym /Java blog /Tilfældig /Java PrintStream klasse
John Squirrels
Niveau
San Francisco

Java PrintStream klasse

Udgivet i gruppen
Hej! I dag vil vi tale om Java PrintStream-klassen og alt, hvad den kan. Faktisk er du allerede bekendt med to metoder i PrintStream- klassen. De er print() og println() , som du sandsynligvis bruger hver dag :) Fordi System.out- variablen er et PrintStream- objekt, kalder du en af ​​denne klasses metoder, når du kalder System.out.println() .  Det generelle formål med PrintStream- klassen er at sende information til en eller anden stream. Hvorfor har vi brug for PrintStream-klassen - 1Denne klasse har flere konstruktører. Her er nogle af de mest brugte:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) kaster FileNotFoundException
  • PrintStream(String outputFileName) kaster FileNotFoundException
For eksempel kan vi videregive navnet på outputfilen til PrintStream- konstruktøren. Alternativt kan vi sende et File- objekt. Lad os se på nogle eksempler for at se, hvordan dette fungerer:

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); 

   } 
}
Denne kode vil oprette en test.txt-fil på skrivebordet (hvis den ikke allerede eksisterer) og sekventielt skrive vores nummer, streng og boolean til den. Her er filindholdet, efter at vi har kørt programmet:

222 
Hello world!
false
Som vi sagde ovenfor, behøver du ikke at sende et File- objekt. Det er nok blot at videregive filstien til konstruktøren:

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); 
   } 
}
Denne kode gør det samme som den forrige kode. En anden interessant metode, der er værd at være opmærksom på, er printf() , som producerer output baseret på en formatstreng. Hvad er en "formatstreng"? Lad mig give et eksempel:

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\\Steve\\Desktop\\test.txt");

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

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

       printStream.close(); 
   } 
}
Her, i stedet for eksplicit at angive vores robots navn og alder i strengen, sætter vi pladsholdere for denne information, repræsenteret ved %s og %d . Og vi videregiver som argumenter de data, der vil erstatte dem. I vores tilfælde er dette strengen " Amigo " og tallet 18. Vi kunne oprette en anden pladsholder, sige %b , og sende endnu et argument. Hvorfor har vi brug for dette? Frem for alt for større fleksibilitet. Hvis dit program kræver, at du ofte viser en velkomstbesked, skal du manuelt indtaste den nødvendige tekst for hver ny robot. Du kan ikke engang gøre denne tekst til en konstant, da alle har forskellige navne og aldre! Men ved at bruge denne nye metode, kan du isolere hilsenen i en konstant og, hvis det er nødvendigt, blot ændre de argumenter, der sendes til printf()- metoden.

import java.io.IOException; 
import java.io.PrintStream; 

public class Main { 

   private static final String GREETINGS_MESSAGE = "My name is %s. I am %d!"; 

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

       PrintStream printStream = new PrintStream("C:\\Users\\Steve\\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(); 
   } 
} 

Udskiftning af System.in

I denne lektion vil vi "bekæmpe systemet" og lære at erstatte System.in- variablen for at omdirigere systemets output, hvorhen vi vil. Du glemmer måske, hvad System.in er, men ingen CodeGym-studerende vil nogensinde glemme denne konstruktion:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (ligesom System.out ) er en statisk variabel i System- klassen. Men i modsætning til System.out refererer den til en anden klasse, nemlig InputStream . Som standard er System.in en strøm, der læser data fra en systemenhed - tastaturet. Men ligesom med System.out kan vi erstatte tastaturet som datakilde. Vi kan læse data hvor som helst vi vil! Lad os se på et eksempel:

import java.io.*; 

public class Main { 

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

       String greetings = "Hi! My name is Amigo!\nI'm learning Java on the CodeGym website.\nOne day I will become a cool programmer!\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); 
       } 

   } 
}
Så hvad gjorde vi? System.in er normalt bundet til tastaturet. Men vi ønsker ikke at læse data fra tastaturet: lad os få dataene læst fra en almindelig streng! Vi oprettede en streng og fik den som et byte-array. Hvorfor har vi brug for bytes? Sagen er, at InputStream er en abstrakt klasse, så vi kan ikke oprette en forekomst af den direkte. Vi skal vælge en af ​​dens efterkommere. For eksempel kan vi vælge ByteArrayInputStream . Det er enkelt, og dets navn alene fortæller os, hvordan det fungerer: dets datakilde er et byte-array. Så vi opretter et byte-array og sender det til konstruktøren af ​​vores strøm , der læser dataene. Og nu er alt klar! Nu skal vi bare bruge System.setIn()metode til eksplicit at indstille værdien af ​​variablen in . Med out , vil du huske, var det heller ikke muligt at indstille variablens værdi direkte: vi var nødt til at bruge metoden setOut() . Efter at vi har tildelt vores InputStream til System.in- variablen, vil vi kontrollere, om vi har opnået vores formål. Vores gamle ven BufferedReader kommer os til hjælp her. Normalt ville denne kode have åbnet konsollen i IntelliJ IDEA og derefter læst data, du indtastede fra tastaturet.

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

       String str; 

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

           System.out.println(str); 
       }
Men nu, når du kører det, vil du se, at vores streng blot vises i konsollen. Der er ingen læsning fra tastaturet. Vi udskiftede datakilden. Det er ikke længere tastaturet, men vores streng! Så enkelt er det :) I dagens lektion lærte vi en ny klasse at kende og udforskede et lille nyt hack til at arbejde med I/O. Nu er det tid til at vende tilbage til kurset og færdiggøre nogle opgaver :) Vi ses i næste lektion!
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION