"Szervusz, Amigo! Ma ismét beleásunk az InputStream és az OutputStream működésébe. A kezdeti magyarázat valójában egy kicsit leegyszerűsített. Ezek nem interfészek. Ezek absztrakt osztályok, és még van néhány implementált metódusuk. Vessünk egy pillantást a módszereikre:"

InputStream metódusok Mit csinál a módszer
int read(byte[] buff);
Ez a módszer azonnal beolvas egy bájtblokkot a pufferbe ( byte array ), amíg a puffer meg nem telik, vagy amíg a forrásnak nincs több olvasnivalója.
A metódus a ténylegesen beolvasott bájtok számát adja vissza (amely kisebb lehet, mint a tömb hossza)
int read();
Ez a metódus beolvas egy bájtot és visszaadja azt. Az eredmény kiszélesedik a megjelenés érdekében. Ha nincs több olvasnivaló bájt, a metódus -1-et ad vissza.
int available();
Ez a metódus az olvasatlan (elérhető) bájtok számát adja vissza.
void close();
Ez a módszer „bezárja” a patakot. Ezt akkor hívja, ha végzett az adatfolyammal.
Az objektum ezután elvégzi a fájl bezárásához szükséges háztartási műveleteket stb.
Ezen a ponton nem olvashat több adatot az adatfolyamból.

– Tehát nem csak egyes bájtokat tudunk olvasni, hanem egész blokkokat is?

"Pontosan."

– Írhatunk egész blokkokat is?

"Igen, nézd meg:"

OutputStream módszerek Mit csinál a módszer
void write(int c);
Ez a módszer egy bájtot ír. Az int típus egy bájtra van szűkítve. A plusz részt egyszerűen eldobjuk.
void write(byte[] buff);
Ez a módszer egy bájt blokkot ír.
void write(byte[] buff, int from, int count);
Ez a módszer egy bájtblokk egy részét írja ki. Olyan esetekben használatos, amikor a bájttömb esetleg nincs teljesen kitöltve.
void flush();
Ha az adatfolyam belsőleg tárol olyan adatokat, amelyeket még nem írtak meg, ez a módszer kényszeríti az írást.
void close();
Ez a módszer „bezárja” a patakot. Ezt akkor hívja, ha végzett az adatfolyammal.
Az objektum ezután elvégzi a fájl bezárásához szükséges háztartási műveleteket stb. A folyamba már nem írhat adatokat, és a flush automatikusan meghívásra kerül.

"Hogy nézne ki a fájl másoló kódja, ha egyszerre egész blokkokat olvasnánk az egyes bájtok helyett?"

"Hmm. Valami ilyesmi:"

Másoljon egy fájlt a lemezre
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"Mindent értek a pufferrel kapcsolatban, de mi ez a számváltozó?"

"Amikor a legújabb adatblokkot olvassuk ki egy fájlból, 1000 helyett 328 bájtot kaphatunk. Tehát az adatok írásakor jeleznünk kell, hogy nem a teljes blokkot írjuk – csak az első 328-at. bájt."

Amikor beolvassuk az utolsó blokkot, az olvasási módszer a ténylegesen olvasott bájtok számát adja vissza. 1000 minden alkalommal, amikor beolvasunk egy blokkot, kivéve az utolsó blokkot, amikor 328-at kapunk.

Tehát amikor egy blokkot írunk, azt jelezzük, hogy a pufferben nem kell minden bájtot írni, csak 328-at (azaz a count változóban tárolt értéket).

– Most már minden világos. Köszönöm, Ellie.