Java programlama dilinde dosya işlemlerine gözatacağız.
Java'da herhangi bir dosyadan veri almak veya yazdırmak gibi işlemleri yapabilmemiz için bir kütüphane mevcuttur. Kütüphanemiz java.io ön eki ile başlar ve içerisinde bir takım metotlar içerir. Programınıza başlamadan önce şöyle bir giriş yapabilirsiniz;
import java.io.*;
Dosya işlemlerine geçmeden önce kütüphanemiz yardımı ile kullanacağımız temel metotlarımızı sizlere aktarmak istiyorum;
exists() : Seçilen dosyanın var olup olmadığını söyler. (boolean)
length() : Seçilen dosyanın dosya boyutunu belirtir. [byte] (long)
renameTo() : Seçilen dosyanın yeniden adlandırılmasını sağlar. (boolean)
getName() : Seçilen dosyanın adını verir. (String)
delete() : Seçilen dosyayı siler. (boolean)
canRead() : Dosyanın gönderilen adres sayesinde okunup okunamayacağını söyler. (boolean)
Temelde kullanılacak metotlarımızı gördüğümüze göre artık nasıl dosya okuma işlemini gerçekleştireceğimizi öğrenebiliriz.
File dosya = new File("DOSYA KONUMU");
if(dosya.exists()) {
System.out.println("Dosya var!");
} else {
System.out.println("Dosya yok!");
}
DOSYA KONUMU: C:\\Users\\PC\\Desktop\\File1.txt
Eğer dosya konumu belirlerken tek \ kullanırsanız hata ile karşılaşırsınız. Çünkü hatırlanacağı üzere \ işareti ile bir sonraki karakterin ekrana basılmasını sağlıyoruz. Özel karakterlerin görüntülenmesini sağlıyor. Bu sebeple \\ iki kez yazmalıyız. Veya bunun yerine ters olarak / işaretini de kullanabiliriz.
Yukarıdaki örneğimiz ile dosyanın var olup olmadığını kontrol edebiliriz.
Dosya İçeriğini Okumak
Dosya içeriğini okurken Scanner sınıfını kullanarak şöyle bir komut oluşturmaktayız;
Scanner siteler = new Scanner(new File("C:/Users/PC/Desktop/siteler.txt"));
Konunun ilerleyen kısımlarında örnekler ile nasıl kullandığımıza göz atacağız.
İstisnalar (Exceptions)
Programın çalıştığı anda ortaya çıkan problemlerdir. Eğer bir istisnai durum oluşuyor ise program normal çalışması dışına çıkarak anormal çalışmaya başlar ve tabiki bu istenmeyecek bir durumdur. Bu tür durumlarla karşı karşıya gelebileceğimiz bazı senaryolar vardır;
- Kullanıcının geçersiz bir veri girmesi (integer alana string girilmesi gibi..)
- 0'a bölünme işlemi yapılmaya çalışılması
- Bir dosyaya ulaşmak istenildiğinde ulaşılamaması
Bu tip durumlarla mücadele edebilmek için programın hata verip kapanmasının önüne geçmek ve örneğin dosya bulunmasa dahi ekrana verilecek çıktıyı programcının ayarlamasına olanak tanımak adına programa şöyle bir bilgi verebiliriz: "Bu yazdığım programda bir hata yer alabilir. Ben bu hatayı göz ardı etmeni ve sonucunda gerçekleşecek işlemleri kabul ediyorum."
Bu bilgiyi programa verebilmek içinse örneğin şunu kullanabiliriz;
public static void main(String[] args) throws FileNotFoundException {
...
}
Dosya İçeriğini Alırken Kullanılan Bazı Fonksiyonlar
hasNext() : İşaretçinin bir sonraki alanında değer varsa TRUE döndürür.
hasNextInt() : İşaretçinin bir sonraki alanında bir INT değer varsa TRUE döndürür.
hasNextDouble() : İşaretçinin bir sonraki alanında bir DOUBLE değer varsa TRUE döndürür.
hasNextLine() : İşaretçinin okuduğu yerden bir sonraki alanda bir değer varsa TRUE döndürür.
nextLine() : İşaretçi sonraki satıra geçer.
Ne Neyi Alacak?
Yukarıdaki fonksiyonlar için imleç konumu önemlidir. Adım adım şöyle bir örnek inceleyelim;
NOT DEFTERİMİZ
Ali
1 74,5
2 85,4
Veli
1 62,5
2 55,4
Can
2 88,7
1 90,2
Not defterimize veriler işlenirken şu mantıkla yazılmış:
Öğrenci Adı
DÖNEM ORTALAMASI
DÖNEM ORTALAMASI
...
Bu şekilde giden bir dosyamızda bu 3 kişinin verilerini ekrana çekerken imleci takip edeceğiz.
Klasik dosya bağlantımızı yapıyoruz;
File f = new File("C:/Users/PC/Desktop/donem.txt");
Scanner dosya = new Scanner(f);
Akabinde bir for döngüsü oluşturup bu verileri ekrana basan şu fonksiyonu yazıyoruz;
for(int i = 0; i < 3; i++) {
String isim = dosya.nextLine();
for(int j=0; j<2; j++) {
int donem = dosya.nextInt();
double ortalama = dosya.nextDouble();
System.out.println(isim + " adlı öğrencinin " + donem + ". dönem ortalaması: " + ortalama);
}
dosya.nextLine();
}
Şimdi bu kodu aşağıdaki görsel ile inceleyelim;
İşlem sonrasında for döngüsüne tekrar gireceği için sonraki satır içinde aynısını yapar ve bu şekilde devam eder.
ÖRNEK
Bir not defteri içerisinde (site.txt) şu verilerimizin olduğunu varsayalım;
site
www.merttopuz.com
yazi
220
bugün
74
toplam
171750
Bu verilerin hepsini ekrana çıktı almak için şöyle bir koda ihtiyacımız var;
File f = new File("C:/Users/PC/Desktop/site.txt");
Scanner dosya = new Scanner(f);
while(dosya.hasNextLine()) {
System.out.println(dosya.nextLine());
}
hasNextLine() ile sonrasında satır olmayana kadar while döngüsünün sürmesini istiyoruz. nextLine() ile ise satırdaki veriyi almasını, ekrana çıktı vermesini ve sonraki satıra geçmesini istiyoruz. Bu sayede ekrana not defterimizde yer alan tüm satırlar çıkıyor.
Peki yukarıdaki örneğimizdeki verilerin hepsini bir dizi içerisine almak istersek?
String[] veriler = new String[8];
int i = 0;
while(dosya.hasNextLine()) {
veriler[i] = dosya.nextLine();
i++;
}
Şeklinde basit bir işlem ile atarız ve ekrana şöyle bir çıktı alabiliriz;
[site, www.merttopuz.com, yazi, 220, bugün, 74, toplam, 171750]
ÖRNEK
Elimizde havaDurumu.txt adında bir not defterimiz olduğunu varsayalım. İçerisinde şu verilerimiz var;
1 12
2 13
3 15
4 12
5 9
6 8
7 9
Haftanın günlerini ve karşısında derecelerini gösteren bu not defterimizdeki verileri şöyle işleyebiliriz;
ÇÖZÜM
File f = new File("C:/Users/PC/Desktop/havaDurumu.txt");
Scanner dosya = new Scanner(f);
while(dosya.hasNextLine()) {
int gun = dosya.nextInt();
int derece = dosya.nextInt();
System.out.println("Haftanın " + gun + ". Günü: " + derece + " Derece");
}
ÇIKTI
Haftanın 1. Günü: 12 Derece
Haftanın 2. Günü: 13 Derece
Haftanın 3. Günü: 15 Derece
Haftanın 4. Günü: 12 Derece
Haftanın 5. Günü: 9 Derece
Haftanın 6. Günü: 8 Derece
Haftanın 7. Günü: 9 Derece