1. InputStreamReader
klass
En annan intressant egenskap hos strömmar är att du kan kombinera flera strömmar tillsammans till kedjor . En ström kan läsa data inte bara från sin interna datakälla, utan också från en annan ström .
Detta är en mycket kraftfull mekanism i Java, som gör det möjligt att skapa komplexa dataläsningsscenarier genom att koppla en ström till en annan. Ett sådant schema ser ut så här:
När ett program läser data från en dataström läser dataströmmen i sin tur data från sin datakälla, som till exempel är en annan dataström eller en fil.
Dessutom läser varje dataström inte bara in och ger ut data, utan kan också transformera den eller utföra olika operationer på den. Ett bra exempel på en sådan "mellanström" är InputStreamReader
klassen.
Vi känner redan till en klass som heter FileReader
— det är en Reader
som läser data från en fil. Och var InputStreamReader
får dess data ifrån? Det stämmer - från en InputStream
.
När du skapar ett InputStreamReader
objekt måste du skicka in ett InputStream
objekt eller en av dess underordnade klasser. Exempel:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
Klassen InputStreamReader
har alla metoder som Reader
klassen har, och de fungerar på exakt samma sätt.
Den största skillnaden mellan InputStreamReader
klassen och till exempel FileReader
var de läser data från. FileReader
läser data från en fil (duh — det är därför det heter ), FileReader
men InputStreamReader
läser data från en InputStream
.
När du läser ett tecken från ett FileReader
objekt med read()
metoden läser det i sin tur två byte från filen på disken och returnerar dem som chars
.
När du läser ett tecken från ett InputStreamReader
objekt med read()
metoden läser det i sin tur två byte från FileInputStream
objektet som skickas till det, vilket i sin tur läser data från filen. Resultatet är en kedja av anrop till read()
metoder.
2. BufferedReader
klass
En annan intressant klass som du sannolikt kommer att använda mycket är BufferedReader
. Detta är också en "mellanström" som läser data från en annan ström.
Som namnet antyder BufferedReader
är klassen en underklass av Reader
och låter dig läsa tecken . Men det som är mest intressant är att du också behöver skicka den en datakälla i form av en ström från vilken tecken kan läsas , alltså en ström som ärver Reader
klassen.
Vad är poängen? Till skillnad från InputStreamReader
, konverterar klassen BufferedReader
inte bytes till tecken: den konverterar ingenting alls. Istället buffrar den data .
När ett program läser ett enstaka tecken från ett BufferedReader
objekt, läser objektet ett stort antal tecken från dess källström på en gång. Och lagrar dem internt.
När nästa tecken läses från objektet BufferedReader
, tar det helt enkelt nästa tecken från dess interna buffertmatris och returnerar det utan att komma åt datakällan. Först när alla tecken i bufferten är förbrukade läses den in ytterligare ett stort antal tecken.
Klassen BufferedReader
har också en mycket användbar metod — , String readLine()
som låter dig läsa hela datasträngar från källströmmen på en gång. Du kan använda den här metoden för att till exempel läsa en fil och visa dess innehåll på skärmen rad för rad. Exempel:
Vi skrev specifikt lite kompakt kod för att illustrera hur bekvämt detta kan vara. Denna kod kan också skrivas med lite mer detaljer.
|
Skapa ett FileReader objekt. Datakällan är en fil. Skapa ett BufferedReader objekt. Datakällan är en FileReader . Så länge det fortfarande finns data i läsaren Läs en rad Visa raden |
Om du kopplar ihop flera strömmar, close()
behöver metoden bara anropas på en av dem. Den strömmen kommer att anropa metoden på sin datakälla, och så vidare, tills close()
den anropas på den slutliga dataströmmen.
3. Läser från konsolen
Och ytterligare ett intressant faktum: Scanner
klassen är inget annat än en mellanliggande ingångsström som läser data från , System.in
som också är en dataström.
Här är två sätt att läsa en rad från konsolen:
Skannerklass | Klasserna BufferedReader och BufferedWriter |
---|---|
|
|
Vår vän är inget annat än en statisk variabel i klassen. Det är en som heter .System.in
in
System
InputStream
in
Så nästan från början av dina Java-studier på CodeGym har du arbetat med dataströmmar och byggt kedjor från dem. Men nu kommer du att göra det mer medvetet.
GO TO FULL VERSION