"Dosya girişi/çıkışı için akışlarla başlayacağız. Ama önce ilk şeyler."
Dosyaları okumak ve yazmak için iki sınıf vardır: FileInputStream ve FileOutputStream . Muhtemelen zaten tahmin ettiğiniz gibi, FileInputStream bir dosyadan baytları sırayla okuyabilir ve FileOutputStream bir dosyaya baytları sırayla yazabilir. İşte bu sınıfların sahip olduğu yöntemler:
Yöntem | Yöntem ne yapar? |
---|---|
|
— Bu yapıcıdır. Oluşturulan nesnenin verileri okuyacağı diskteki bir dosyanın adını belirtmenizi sağlar. |
|
— Bu yöntem, dosyadan bir bayt okur ve onu döndürür. Dönüş değeri bir int'e genişletilir. |
|
— Bu yöntem okunmamış (mevcut) bayt sayısını döndürür. |
|
— Bu yöntem akışı "kapatır". Akışla çalışmayı bitirdiğinizde bunu çağırırsınız. Nesne daha sonra dosyayı vb. kapatmak için gereken temizlik işlemlerini gerçekleştirir. Bu noktada, akıştan daha fazla veri okuyamazsınız. |
Sadece eğlencesine, bir dosyadaki tüm baytların toplamını hesaplayalım. İşte kodun nasıl göründüğü:
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.
}
"Bunun gibi bir şeyi zaten inceledik. FileOutputStream nasıl organize ediliyor?"
"Tamam. Şuna bak:"
Yöntem | Yöntem ne yapar? |
---|---|
|
"Bu yapıcıdır. Oluşturulan nesnenin verileri yazacağı diskteki bir dosyanın adını belirtmenize izin verir." |
|
"Bu yöntem, verileri bir bayta indirerek bir sonraki baytı yazar." |
|
"Yazılacak veriler genellikle önce bellekte büyük bloklar halinde toplanır ve sonra yalnızca diske yazılır."
Flush komutu, kaydedilmemiş tüm bilgileri diske yazılmaya zorlar. |
|
"Bu yöntem akışı 'kapatır'. Akışla çalışmayı bitirdiğinizde bunu çağırırsınız." Nesne daha sonra dosyayı vb. kapatmak için gereken temizlik işlemlerini gerçekleştirir. |
Artık akışa veri yazamazsınız ve yıkama otomatik olarak çağrılır.
"Bu kadar?"
"Evet, aslında yazmak için tek bir yöntem var: write(). Her seferinde yalnızca bir bayt yazıyor. Ama dosyaya istediğiniz kadar bilgi yazmanıza izin veriyor."
Programlama, büyük ve karmaşık bir görevi birçok küçük göreve bölme işlemidir. Temelde aynı süreç burada da oluyor: büyük veri bloklarını okumak ve yazmak, her seferinde bir bayt olmak üzere, ısırık büyüklüğünde parçalar halinde okuma ve yazmaya bölünür.
Diskteki bir dosyayı kopyalamak için bu sınıfları şu şekilde kullanabilirsiniz:
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();
}
"Teşekkürler Rishi. Sonunda bu kodun gerçekte nasıl çalıştığını anladım."
GO TO FULL VERSION