15 KASIM 2017
ÇARŞAMBA
23.28
Java - Dosya İşlemleri

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

YORUMLAR 4
2
cengizhan
07 KASIM 2019 - 21.40
Kolay gelsin. donem.txt içine not ortalamalarını kopyaladıktan sonra bir enter'lik boşluk bırakmak gerekiyor. Yoksa program işlem sonunda hata veriyor..
CEVAPLA
7
Kerem Bal
08 TEMMUZ 2018 - 12.20
İnternette birçok kaynağa baktım ama bu kadar faydalı bir kaynak bulamadım. Konu içinde yer alan görsel nokta atışı olmuş. Emeğinize sağlık....
CEVAPLA
4
Mert Topuz
09 TEMMUZ 2018 - 00.10
Değerli görüşünüz için teşekkürler, umarım faydalı olabilmişimdir :)
7
Merve KARATAŞ
08 MAYIS 2018 - 17.47
Güzel bir anlatım olmuş ellerinize sağlık
CEVAPLA
3
Mert Topuz
11 MAYIS 2018 - 23.33
Teşekkür ederim, işinize yaradıysa ne mutlu bana :)
13
Metin Melikşah
03 OCAK 2018 - 01.17
Uzun süredir takip ediyorum başka bu şekilde net ve ve anlaşılır anlatım yapan yok.
CEVAPLA
7
Mert Topuz
03 OCAK 2018 - 22.06
Teşekkürler bu güzel görüşün için Metin, yararlı olabildiğimi görmek çok güzel :)
YORUM BIRAK
Şuanda bu yoruma cevap yazıyorsunuz:
İptal Et