CodeGym/Java blogg/Slumpmässig/Java PrintStream-klass
John Squirrels
Nivå
San Francisco

Java PrintStream-klass

Publicerad i gruppen
Hej! Idag ska vi prata om Java PrintStream-klassen och allt den kan göra. Du är faktiskt redan bekant med två metoder i klassen PrintStream . De är print() och println() , som du förmodligen använder varje dag :) Eftersom System.out -variabeln är ett PrintStream- objekt anropar du en av den här klassens metoder när du anropar System.out.println() .  Det allmänna syftet med PrintStream- klassen är att skicka information till någon stream. Varför vi behöver PrintStream-klassen - 1Denna klass har flera konstruktörer. Här är några av de mest använda:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) kastar FileNotFoundException
  • PrintStream(String outputFileName) kastar FileNotFoundException
Till exempel kan vi skicka namnet på utdatafilen till PrintStream- konstruktorn. Alternativt kan vi skicka ett File- objekt. Låt oss titta på några exempel för att se hur detta fungerar:
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);

   }
}
Den här koden kommer att skapa en test.txt-fil på skrivbordet (om den inte redan finns) och sekventiellt skriva vårt nummer, sträng och boolean till den. Här är filinnehållet efter att vi kört programmet:
222
Hello world!
false
Som vi sa ovan behöver du inte skicka ett File -objekt. Det räcker att helt enkelt skicka filsökvägen till konstruktorn:
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);
   }
}
Den här koden gör samma sak som den tidigare koden. En annan intressant metod värd vår uppmärksamhet är printf() , som producerar utdata baserat på en formatsträng. Vad är en "formatsträng"? Låt mig ge ett exempel:
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();
   }
}
Här, istället för att uttryckligen ange vår robots namn och ålder i strängen, sätter vi platshållare för denna information, representerade av %s och %d . Och vi skickar som argument de data som kommer att ersätta dem. I vårt fall är detta strängen " Amigo " och siffran 18. Vi kan skapa en annan platshållare, säg %b , och skicka ytterligare ett argument. Varför behöver vi detta? Framför allt för större flexibilitet. Om ditt program kräver att du visar ett välkomstmeddelande ofta, måste du manuellt skriva ut den nödvändiga texten för varje ny robot. Du kan inte ens göra den här texten till en konstant, eftersom alla har olika namn och åldrar! Men med den här nya metoden kan du isolera hälsningen i en konstant och, om nödvändigt, helt enkelt ändra argumenten som skickas till metoden printf() .
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();
   }
}

Ersätter System.in

I den här lektionen kommer vi att "bekämpa systemet" och lära oss hur man ersätter variabeln System.in för att omdirigera systemutdata dit vi vill. Du kanske glömmer vad System.in är, men ingen CodeGym-student kommer någonsin att glömma denna konstruktion:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (precis som System.out ) är en statisk variabel i klassen System . Men till skillnad från System.out refererar den till en annan klass, nämligen InputStream . Som standard är System.in en ström som läser data från en systemenhet - tangentbordet. Men precis som med System.out kan vi ersätta tangentbordet som datakälla. Vi kan läsa data var vi vill! Låt oss titta på ett exempel:
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å vad gjorde vi? System.in är vanligtvis bunden till tangentbordet. Men vi vill inte läsa data från tangentbordet: låt oss låta data läsas från en vanlig sträng! Vi skapade en sträng och fick den som en byte-array. Varför behöver vi bytes? Saken är att InputStream är en abstrakt klass, så vi kan inte skapa en instans av den direkt. Vi måste välja en av dess ättlingar. Till exempel kan vi välja ByteArrayInputStream . Det är enkelt, och bara dess namn berättar hur det fungerar: dess datakälla är en byte-array. Så vi skapar en byte-array och skickar den till konstruktören av vår ström som kommer att läsa data. Och nu är allt klart! Nu behöver vi bara använda System.setIn()metod för att explicit ställa in värdet på variabeln in . Med out , minns du, var det inte heller möjligt att ställa in variabelns värde direkt: vi var tvungna att använda metoden setOut() . Efter att vi tilldelat vår InputStream till variabeln System.in vill vi kontrollera om vi har uppnått vårt syfte. Vår gamla vän BufferedReader kommer till vår hjälp här. Normalt skulle den här koden ha öppnat konsolen i IntelliJ IDEA och sedan läst data du angett från tangentbordet.
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ör det kommer du att se att vår sträng helt enkelt visas i konsolen. Det finns ingen läsning från tangentbordet. Vi bytte ut datakällan. Det är inte längre tangentbordet, utan vår sträng! Så enkelt är det :) I dagens lektion lärde vi känna en ny klass och utforskade ett litet nytt hack för att arbeta med I/O. Nu är det dags att återvända till kursen och slutföra några uppgifter :) Vi ses på nästa lektion!
Kommentarer
  • Populär
  • Ny
  • Gammal
Du måste vara inloggad för att lämna en kommentar
Den här sidan har inga kommentarer än