Gyakorlati alapok II.
Bemenet - kimenet
A szűrők
Az egyik előző, A csatorna (stream) fejezetben 4 olyan alaposztályt határozhatunk meg, amelyek képesek önálló input-output-műveletek elvégzésére:
-
InputStream - bemeneti bájtcsatorna,
-
OutputStream - kimeneti bájtcsatorna,
-
Reader - bemeneti karaktercsatorna,
-
Writer - kimeneti karaktercsatorna.
Ezen osztályok már említett módon bájt-, vagy karakter-alapú kommunikációs csatornák felépítésére képesek. A szűrők az alaposztályok alapértelmezésben kissé szegényes tulajdonságait "tuningolják fel", azaz új tulajdonságokkal támogatják meg alapszintű működésüket.
Az alábbi példában már nemcsak bájtokkal, hanem egy double típusú PI értékkel is dolgozunk: a fileOutputStream fájlcsatorna fölé egy további, dataOutputStream nevű csatornát hozunk létre, amely a változóértéket (3.1415926) a PI.txt nevű fájlba írja ki, majd onnan olvassa vissza a konzolra:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\PI.txt");
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
dataOutputStream.writeDouble((double)3.1415926);
DataInputStream dataInputStream = new DataInputStream(new FileInputStream("D:\\PI.txt"));
double d = dataInputStream.readDouble();
System.out.println(d);
fileOutputStream.close();
dataOutputStream.close();
dataInputStream.close();
}
}
Végeredmény:
a konzolon 3.1415926
a PI fájlban értelmezhetetlen karakterek
A végeredmény a fájlban nem egészen az elvárt. Vajon mi a hiba?
Láthatóan most nem karakterekkel, hanem double adattípussal foglalkozunk. Míg a System.out.println() metódus megoldja ezen adattípus konzolra való illesztését, addig a DataOutputStream szűrő már nem, ennek végeredménye tehát nem olvasható ki értelmesen a PI szövegfájlból. (Valószínűnek tartom, hogy az értelmezhetetlen krikszkraksz a letárolt double adattípus bináris adatainak szöveges megjelenítése.)
A megoldás egy másik, PrintStream nevű osztály használata, amely gondoskodik a megfelelő típusos illesztésről.
További érdekes adalék a DataInputStream nevű osztály readLine() metódusa, amely ugyan elvégzi feladatát, azaz kiszedi a PI string típusú karakterfüzért a PI szövegfájlból (3.1415926), ám működőképessége ellenére a rendszer deprecated - elavult jelzővel illeti és a kódban át is húzza:
A jelenségről részletesen olvashatunk a Amikor az osztály vagy metódus elavult (deprecated) című fejezetben.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\PI.txt");
PrintStream printStream = new PrintStream(fileOutputStream);
printStream.print(3.1415926);
DataInputStream dataInputStream = new DataInputStream(new
FileInputStream("D:\\PI.txt"));
String PI = dataInputStream.readLine();
System.out.println(PI);
fileOutputStream.close();
printStream.close();
dataInputStream.close();
}
}
Végeredmény:
a konzolon és a PI fájlban 3.1415926
A fenti példából láthatjuk és ez egyúttal a szűrők egyik legfontosabb közös tulajdonsága, hogy az eredeti csatornaobjektumot bemeneti paraméterként fogadják (itt: DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);). Sőt, mivel a szűrő maga is csatorna, előnyös tulajdonságaik még olyan módon is egyesíthetők, hogy egymásba ágyazzuk őket, azaz a szűrő bemeneti paraméteréül egy másik szűrőt adunk meg; ilyenkor tulajdonságaik sok esetben összeadódnak.
A java.io csomag a szűrők óriási, előre megírt választékát kínálja fel a Java-fejlesztőknek; emiatt és az egymásba ágyazhatóság gazdag variációs lehetőségei miatt mindenki képes megtalálni a számára legkedvezőbb tulajdonságokkal rendelkező csatornaviselkedést.