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:

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu

 

A jelenségről részletesen olvashatunk a Amikor az osztály vagy metódus elavult (deprecated) című fejezetben.

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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.