„Vom începe cu fluxuri de intrare/ieșire a fișierelor. Dar mai întâi lucrurile.”

Există două clase pentru citirea și scrierea fișierelor: FileInputStream și FileOutputStream . După cum probabil ai ghicit deja, FileInputStream poate citi secvenţial octeţi dintr-un fişier, iar FileOutputStream poate scrie secvenţial octeţi într-un fişier. Iată metodele pe care le au aceste clase:

Metodă Ce face metoda
FileInputStream(String fileName);
— Acesta este constructorul. Vă permite să specificați numele unui fișier de pe disc, de pe care obiectul creat va citi datele.
int read();
— Această metodă citește un octet din fișier și îl returnează. Valoarea returnată este extinsă la un int.
int available();
— Această metodă returnează numărul de octeți necitiți (disponibili).
void close();
— Această metodă „închide” fluxul. Numiți asta când ați terminat de lucrat cu fluxul.
Obiectul efectuează apoi operațiunile de întreținere necesare închiderii fișierului etc.
În acest moment, nu mai puteți citi date din flux.

Doar pentru distracția, să calculăm suma tuturor octeților dintr-un fișier. Iată cum arată codul:

Însumați toți octeții dintr-un fișier
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.
}

„Ne-am uitat deja la ceva de genul acesta. Cum este organizat FileOutputStream?”

"OK. Uită-te la asta:"

Metodă Ce face metoda
FileOutputStream (String fileName);
"Acesta este constructorul. Vă permite să specificați numele unui fișier de pe disc, pe care obiectul creat va scrie date."
void write(int data);
„Această metodă scrie următorul octet, trunchiind datele la un octet.”
void flush();
„Datele care urmează să fie scrise sunt adesea colectate mai întâi în blocuri mari din memorie și apoi scrise doar pe disc”.

Comanda de flush forțează ca toate informațiile nesalvate să fie scrise pe disc.

void close();
„Această metodă „închide” fluxul. O numiți când ați terminat de lucrat cu fluxul.”
Obiectul efectuează apoi operațiunile de menaj necesare închiderii dosarului etc.

Nu mai puteți scrie date în flux, iar fluxul este apelat automat.

"Asta este?"

"Da, există de fapt o singură metodă de scriere: write(). Scrie doar un octet la un moment dat. Dar vă permite să scrieți câte informații doriți în fișier."

Programarea este un proces de împărțire a unei sarcini mari și complexe în mai multe sarcini mici. În esență, același proces are loc aici: citirea și scrierea de blocuri mari de date este împărțită în citire și scriere în bucăți de dimensiuni mici - câte un octet.

Iată cum puteți utiliza aceste clase pentru a copia un fișier pe disc:

Copiați un fișier pe disc
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();
}

— Mulțumesc, Rishi. În sfârșit, înțeleg cum funcționează de fapt acest cod.