"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 |
---|---|
|
– 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. |
|
— 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. |
|
— Ez a metódus az olvasatlan (elérhető) bájtok számát adja vissza. |
|
— 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:
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 |
---|---|
|
"Ez a konstruktor. Lehetővé teszi a lemezen lévő fájl nevének megadását, amelyre a létrehozott objektum adatokat ír." |
|
"Ez a módszer a következő bájtot írja, az adatokat egy bájtra csonkolja." |
|
"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. |
|
"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:
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."
GO TO FULL VERSION