CodeGym /Java-blogg /Tilfeldig /Øv deg på å jobbe med BuffreredReader- og InputStreamRead...
John Squirrels
Nivå
San Francisco

Øv deg på å jobbe med BuffreredReader- og InputStreamReader-klassene

Publisert i gruppen
Hei! Dagens leksjon vil for enkelhets skyld deles i to deler. Vi vil gjenta noen gamle emner som vi har vært inne på tidligere, og vi vil vurdere noen nye funksjoner :) La oss starte med den første. Du har allerede en klasse som BufferedReadermange ganger. Jeg håper du ikke har hatt tid til å glemme denne uttalelsen:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Før du leser videre, prøv å huske hva hver komponent — System.in, InputStreamReader, BufferedReader— er ansvarlig for og hvorfor den er nødvendig. Husket du? Hvis ikke, ingen bekymringer. :) Hvis du har glemt noe, les denne leksjonen på nytt , som er dedikert til leserklasser. Vi skal kort huske hva hver av dem kan gjøre. System.in— dette er en strøm for å motta data fra tastaturet.  I prinsippet vil det alene være nok til å implementere logikken som kreves for å lese tekst. Men, som du vil huske, System.inkan bare lese bytes, ikke tegn:

public class Main {

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

       while (true) { 
           int x = System.in.read(); 
           System.out.println(x); 
       } 
   } 
} 
Hvis vi utfører denne koden og skriver inn den kyrilliske bokstaven "Й", vil utgangen være:

Й
208
153
10 
Kyrilliske tegn opptar 2 byte i minnet, og de vises på skjermen. Tallet 10 er desimalrepresentasjonen av et linjeskifttegn, dvs. fra å trykke Enter. Å lese bytes er en fornøyelse, så System.indet er ikke særlig praktisk å bruke. For å kunne lese kyrilliske (og andre) bokstaver korrekt, bruker vi InputStreamReadersom omslag:

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); 
       } 
   } 
} 
Vi skriver inn samme bokstav "Й", men resultatet er annerledes denne gangen:

Й 
1049 
10
InputStreamReaderkonverterte to byte (208 og 153) til enkelttallet 1049. Dette er hva det betyr å lese tegn. 1049 tilsvarer den kyrilliske bokstaven "Й". Vi kan lett overbevise oss selv om at dette er sant:

public class Main { 

   public static void main(String[] args) throws IOException { 
       char x = 1049; 
       System.out.println(x); 
   } 
} 
Konsoll utgang:

Й
Og som forBufferedReader(og generelt BufferedAnythingYouWant), brukes bufrede klasser for å optimalisere ytelsen. Å få tilgang til en datakilde (fil, konsoll, nettressurs) er ganske dyrt når det gjelder ytelse. Derfor, for å redusere antall tilganger, BufferedReaderleser og akkumulerer data i en spesiell buffer, og vi får det derfra. Som et resultat blir antallet ganger datakilden åpnes kuttet - muligens med flere størrelsesordener! En annen av BufferedReaderfunksjonene og dens fordel i forhold til den vanlige InputStreamReader, er den ekstremt nyttige readLine()metoden, som leser hele datalinjer, ikke individuelle tall. Dette er selvfølgelig super praktisk når du har å gjøre med store tekster. Slik ser leselinjer ut:

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 ("The user entered the following text:"); 
       System.out.println(s); 
       reader.close(); 
   } 
}

BufferedReader+InputStreamReader is faster than InputStreamReader alone 
The user entered the following text: 
BufferedReader+InputStreamReader is faster than InputStreamReader alone
Øv på å jobbe med BuffreredReader- og InputStreamReader-klassene - 2Selvfølgelig, BufferedReaderer veldig fleksibel. Du er ikke begrenset til å jobbe med tastaturet. Du kan for eksempel lese data direkte fra nettet, ganske enkelt ved å sende den nødvendige URL-adressen til en leser:

public class URLReader { 

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

       URL oracle = new URL("https://www.oracle.com/index.html"); 
       BufferedReader in = new BufferedReader( 
               new InputStreamReader(oracle.openStream())); 

       String inputLine; 
       while ((inputLine = in.readLine()) != null) 
           System.out.println(inputLine); 
       in.close(); 
   } 
}
Du kan lese data fra en fil ved å sende filbanen:

public class Main { 

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

       FileInputStream fileInputStream = new FileInputStream("testFile.txt"); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); 

       String str; 

       while ((str = reader.readLine()) != null)   { 
           System.out.println (str); 
       } 

       reader.close(); 
   } 
}

Bytter System.out

La oss nå ta en titt på en interessant funksjon som vi ikke har vært inne på før. Som du sikkert husker, Systemhar klassen to statiske felt - System.inog  System.out. Disse tvillingbrødrene er strømobjekter. System.iner en InputStream. Og System.out er en PrintStream. Akkurat nå skal vi snakke om  System.out. Hvis vi går inn i Systemklassens kildekode, ser vi dette:

public final class System { 
……………... 
public final static PrintStream out = null; 
 ………… 
} 
Dermed  System.out  er ganske enkelt en vanlig statisk variabel iSystem klassen. Det er ikke noe magisk med det :) Variabelen outer en PrintStreamreferanse. Her er et interessant spørsmål: Når System.out.println()utføres, hvorfor går utdataene til konsollen og ikke et annet sted? Og kan dette endres på en eller annen måte? Anta for eksempel at vi vil lese data fra konsollen og skrive dem til en tekstfil. Er det mulig å implementere dette på en eller annen måte ved å bruke  System.outi stedet for ekstra leser- og skribentklasser? Det er det faktisk :) Og vi kan gjøre det selv om variabelen System.outer merket med finalmodifikatoren!  Øv på å jobbe med BuffreredReader- og InputStreamReader-klassene - 3Så hva trenger vi for å få dette til? Først av alt trenger vi et nytt PrintStreamobjekt for å erstatte det nåværende. Det gjeldende objektet, satt iSystemklasse som standard, tjener ikke våre formål: den peker til konsollen. Du må opprette en ny som peker til en tekstfil — "destinasjonen" for dataene våre. For det andre må vi forstå hvordan vi tildeler en ny verdi til variabelen System.out. Du kan ikke bruke en enkel tilordningsoperator, fordi variabelen er merket final. La oss jobbe bakover fra slutten. Som det skjer, Systemhar klassen metoden vi trenger: setOut(). Den tar et PrintStreamobjekt og setter det som destinasjon for utdata. Det er akkurat det vi trenger! Alt som gjenstår er å lage et PrintStreamobjekt. Dette er også enkelt:

PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Hele koden vil se slik ut:

public class SystemRedirectService { 

   public static void main(String arr[]) throws FileNotFoundException 
   { 
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
       /* Save the current value of System.out in a separate variable so that later 
       we can switch back to console output */ 

       PrintStream console = System.out; 
       // Assign a new value to System.out 
       System.setOut(filePrintStream); 
       System.out.println("This line will be written to the text file"); 

       // Restore the old value of System.out 
       System.setOut(console); 
       System.out.println("But this line will be output to the console!"); 
   } 
}
Som et resultat blir den første strengen skrevet til tekstfilen, og den andre vises i konsollen :) Du kan kopiere denne koden til IDE-en din og kjøre den. Åpne tekstfilen og du vil se at strengen har blitt skrevet der :) Med dette har leksjonen vår kommet til slutten. I dag husket vi hvordan man jobber med strømmer og lesere. Vi husket hvordan de skiller seg fra hverandre og lærte om noen nye funksjoner i System.out, som vi har brukt i nesten hver leksjon :) Frem til neste leksjon!
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION