"Szervusz, Amigo! Most két interfészről beszélek: az InputStream és az OutputStream . Absztrakt osztályként vannak deklarálva, de ha jobban belemélyedsz, láthatod, hogy lényegében interfészek . Szinte minden metódusuk absztrakt, kivéve a néhány jelentéktelen módszer. Nagyon hasonlítanak a korábban gondolt „ testőrre ”.

Ezek nagyon érdekes felületek. Egyelőre szándékosan interfészeknek nevezem őket , hogy megértse, miért van szükségünk rájuk. Aztán beszélünk arról, hogy valójában miért is absztrakt osztályok.

"Oké. Akkor mik ezek az interfészek?"

– Minden további nélkül elmondom.

A Java-ban van egy érdekes dolog, az úgynevezett " folyam ". A folyam egy nagyon egyszerű entitás. Az egyszerűsége pedig a kulcsa az adatcsere nagyon hatékony módjának. Kétféle adatfolyam létezik: az olvasáshoz és az íráshoz használható adatfolyam .

Ahogy valószínűleg már sejtette, írhat adatokat egy adatfolyamba íráshoz . Ennek van egy írási módja. Adatfolyamból olvashat adatokat olvasáshoz . Ehhez van egy read () metódusa.

Az InputStream  az olvasást támogató adatfolyam interfésze. A következő képességet határozza meg: «bájtok olvashatók tőlem».

Hasonlóképpen, az OutputStream , az OutputStream egy interfész egy adatfolyamhoz, amely támogatja az írást. Ez a következő képességet határozza meg: «bájtok írhatók nekem».

"Ez az?"

"Nagyjából. De a lényeg az, hogy a Java-nak rengeteg osztálya van, amelyek képesek együttműködni az InputStream és az OutputStream segítségével . Például egy fájlt szeretne olvasni a lemezről, és megjeleníteni a tartalmát a képernyőn. Mi sem lehet könnyebb."

A lemezen lévő fájl adatainak olvasásához speciális FileInputStream osztályunk van, amely megvalósítja az InputStream interfészt. Másik fájlba szeretné írni ezeket az adatokat? Ehhez megvan a FileOutputStream osztály, amely az OutputStream felületet valósítja meg. A következő kód megmutatja, mit kell tennie az adatok egyik fájlból a másikba másolásához.

Kód
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

Képzeld el, hogy írtunk egy osztályt, és hozzáadtuk az  InputStream  és  OutputStream képességeket.

Ha megfelelően implementáltuk ezeket az interfészeket, akkor osztályunk példányai már elmenthetők vagy kiolvashatók egy fájlba. Egyszerűen úgy, hogy elolvassa a tartalmukat az olvasási módszerrel. Vagy betölthetők egy fájlból egy objektum létrehozásával és a fájl tartalmának írási módszerével .

– Talán egy példa?

"Biztos."

Kód Leírás
class MyClass
{
private ArrayList<Integer> list;
}
Az egyszerűség kedvéért képzeljük el, hogy osztályunk egyetlen objektumot tartalmaz, egy egész számokat tartalmazó ArrayList-et.

Most olvasási és írási módszereket adunk hozzá

Kód Leírás
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
Osztályunk most a read metódust valósítja meg, amely lehetővé teszi a lista teljes tartalmának szekvenciális olvasását .

És az írási módszer, amellyel értékeket írhatunk a listánkra.

Természetesen ez nem az InputStream és az OutputStream interfész megvalósítása, de nagyon hasonló.

"Igen, értem. Szóval hogyan lehet egy ilyen objektum tartalmát fájlba menteni?"

"Hadd mondjak egy példát:"

Írjon egy MyClass objektumot egy fájlba
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
MyClass objektum beolvasása fájlból
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

"Holy Moly! Valóban nagyon hasonlít az InputStream/OutputStream használatához. A streamek édesek!"

"Majd néhány!"