"A fájlbeviteli/kimeneti adatfolyamokkal kezdjük. De először is."

A fájlok olvasására és írására két osztály létezik: FileInputStream és FileOutputStream . Ahogy valószínűleg már sejtette, a FileInputStream képes szekvenciális bájtokat olvasni egy fájlból, a FileOutputStream pedig szekvenciális bájtokat írhat egy fájlba. Íme az osztályok metódusai:

Módszer Mit csinál a módszer
FileInputStream(String fileName);
– Ez a kivitelező. Lehetővé teszi a lemezen lévő fájl nevének megadását, amelyről a létrehozott objektum adatokat olvas ki.
int read();
— Ez a metódus beolvas egy bájtot a fájlból, és visszaadja azt. A visszatérési érték egy int-re bővül.
int available();
— Ez a metódus az olvasatlan (elérhető) bájtok számát adja vissza.
void close();
— Ez a módszer «lezá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.

Csak a móka kedvéért számítsuk ki egy fájl összes bájtjának összegét. Így néz ki a kód:

Összefoglalja az összes bájtot egy fájlban
public static void main(String[] args) throws Exception
{
 //Create a FileInputStream object bound to «c:/data.txt».
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); //Read the next byte
  sum +=  data; //Add it to the running total
 }
 inputStream.close(); // Close the stream

 System.out.println(sum); // Display the sum on the screen.
}

"Már megvizsgáltunk ilyesmit. Hogyan van megszervezve a FileOutputStream?"

"Rendben. Ezt nézd:"

Módszer Mit csinál a módszer
FileOutputStream (String fileName);
"Ez a konstruktor. Lehetővé teszi a lemezen lévő fájl nevének megadását, amelyre a létrehozott objektum adatokat ír."
void write(int data);
"Ez a módszer a következő bájtot írja, az adatokat egy bájtra csonkolja."
void flush();
"Az írandó adatokat gyakran először nagy blokkokban gyűjtik össze a memóriában, és csak ezután írják ki a lemezre."

A flush parancs az összes nem mentett információt lemezre írja.

void close();
"Ez a módszer «bezárja» az adatfolyamot. 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 folyamra már nem írhat adatokat, és a flush automatikusan meghívásra kerül.

"Ez az?"

"Igen, igazából csak egy módszer van az írásra: write(). Egyszerre csak egy bájtot ír. De annyi információt írhat a fájlba, amennyit csak akar."

A programozás egy nagy és összetett feladat több kicsire osztásának folyamata. Lényegében ugyanaz a folyamat megy végbe itt is: a nagy adattömbök olvasása és írása felosztásra kerül olvasásra és írásra, falatnyi darabokra – egy-egy bájtra.

A következőképpen használhatja ezeket az osztályokat egy fájl lemezre másolásához:

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");

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); // Read the next byte into the data variable
  outputStream.write(data); // and write it to the second stream
 }

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

"Köszönöm, Rishi. Végre megértem, hogyan működik ez a kód valójában."