"Vi börjar med strömmar för filinmatning/utmatning. Men först till kvarn."

Det finns två klasser för att läsa och skriva filer: FileInputStream och FileOutputStream . Som du säkert redan gissat kan FileInputStream sekventiellt läsa bytes från en fil, och FileOutputStream kan sekventiellt skriva byte till en fil. Här är metoderna som dessa klasser har:

Metod Vad metoden gör
FileInputStream(String fileName);
— Det här är konstruktören. Den låter dig ange namnet på en fil på disken, från vilken det skapade objektet kommer att läsa data.
int read();
— Den här metoden läser en byte från filen och returnerar den. Returvärdet breddas till en int.
int available();
— Den här metoden returnerar antalet olästa (tillgängliga) byte.
void close();
— Denna metod »stänger» strömmen. Du kallar detta när du är klar med strömmen.
Objektet utför sedan de hushållningsoperationer som behövs för att stänga filen etc.
Vid det här laget kan du inte läsa mer data från strömmen.

Bara för skojs skull, låt oss beräkna summan av alla byte i en fil. Så här ser koden ut:

Summera alla byte i en fil
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.
}

"Vi har redan undersökt något sådant här. Hur är FileOutputStream organiserat?"

"OK. Titta på det här:"

Metod Vad metoden gör
FileOutputStream (String fileName);
"Det här är konstruktorn. Den låter dig ange namnet på en fil på disken, till vilken det skapade objektet kommer att skriva data."
void write(int data);
"Denna metod skriver nästa byte, trunkerar data till en byte."
void flush();
"Data som ska skrivas samlas ofta först i stora block i minnet och skrivs sedan bara till disk."

Flush-kommandot tvingar all osparad information att skrivas till disk.

void close();
"Denna metod "stänger" strömmen. Du kallar detta när du är klar med strömmen."
Objektet utför sedan de hushållsoperationer som behövs för att stänga filen osv.

Du kan inte längre skriva data till strömmen, och flush anropas automatiskt.

"Det är allt?"

"Japp, det finns faktiskt bara en metod för att skriva: write(). Den skriver bara en byte åt gången. Men den låter dig skriva så mycket information du vill till filen."

Programmering är en process där en stor och komplex uppgift delas upp i många små. I princip samma process sker här: läsning och skrivning av stora datablock delas upp i läsning och skrivning i små bitar - en byte i taget.

Så här kan du använda dessa klasser för att kopiera en fil på disk:

Kopiera en fil på disken
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();
}

"Tack, Rishi. Jag förstår äntligen hur den här koden faktiskt fungerar."