Java ile dosya okuma, yazma ve içerik değiştirme (BufferedReader, BufferedWriter ve replace)
Diyelim ki bir dosyadaki belli yerleri, kelimeleri ya da karakter dizilerini başka bir kelime ya da karakter dizisiyle değiştirmemiz gerekiyor ve bunu bir Java programıyla yapacağız. O halde kabaca üç şey yapılacak demektir:
- Dosyadan okuma
- İçeriği değiştirme
- İçeriği dosyaya kaydetme
Şimdi bunun nasıl yapıldığından bahsedelim.
C# ve Java'da dosyadan okuma yapmak ve dosyaya yazmak için kullanılan paket IO paketi. Bu I ve O, Input ve Output yani "girdi" ve "çıktı" kelimelerinin baş harfleri. Öncelikle bu kütüphaneyi uygulamamıza import etmemiz gerekiyor.
import java.io.*;
Bu uygulama için kullanabileceğimiz BufferedReader ve BufferedWriter sınıfları var. Okunacak dosyanın yeri d:\yazi.txt olsun. Onu önce bir File dosyası olarak uygulamaya tanıtalım.
File dosya=new File("d:\\yazi.txt");
Not: "\" bir kaçış karakteri. Ama aslında string içinde bulunması gerektiği için bir başka "\" ile durumu belli ediyoruz. Dolayısıyla d:\\yazi.txt şeklinde iki "\" kullanıyoruz.
Ardından dosya okumak için BufferedReader'i tanımlıyoruz:
BufferedReader oku;
Okuma dosyasının yerinde olup olmaması gibi Exception'lar ortaya çıkabileceği için bu oku objesini bir try catch kalıbı içinde kullanacağız. İçine de bir FileReader göndermemiz gerekiyor. Bu FileReader da "dosya" diye tanımladığımız yazi.txt dosyasını içinde bulundurmalı;
try{
oku=new BufferedReader(new FileReader(dosya));
}Bu dosyanın içeriğini satır satır okuyacağız. Her okumada bir satır string geri dönürecek. Bu string'i hafızada tutmak için daha önceden bir string tanımlasak hoş olur:
String s = "";
Ardından yine try catch kalıbı içinde tanımladığımız oku'dan gelecekleri bu string'e taşıyacağız;
s = oku.readLine()
Tabii ki birden fazla satırı almamız gerektiği için her satırı s'ye eklemek daha uygun olacaktır. Bunun için while döngüsü kurup oku içinde "satırlar bitmediyse bir satır daha oku" şeklinde bir ayarlama yapmak gerekiyor;
while(oku.ready()){
s+ = oku.readLine();
}Fakat her satır bitiminde bir alt satıra geçildiğini gösteren bir ibare bulunmalı onun için de "\r\n"yi her satırın ardından eklememiz gerekiyor;
while(oku.ready()){
s+ = oku.readLine() + "\r\n" ;
}Artık tüm dosyanın içeriği s adını verdiğimiz String'in içinde yer alıyor. Şimdi bu s'nin içinde değiştirmek istediğimiz yerler var. Bunun için String sınıfının bir metodu olan replace()'i kullanıyoruz. replace()'e iki parametre göndereceğiz, ilki dosya içinde değiştirmek istediğimiz karakter dizisi, diğeri de bu değiştirilecek eski karakter dizisi yerine gelecek olan karakter dizisi. Diyelim ki benim dosyamın içinde "Ahmet" isimleri yanlış yazılmış, ve bunları "Mehmet" olarak değiştirmek istiyorum. O zaman kod şöyle olmalı;
s = s.replace("Ahmet","Mehmet");Artık yeni içeriğim s'ye atılmış durumda. Sırada bunu bir dosyaya kaydetmek var. Bunun için de okumaya benzer olarak BuferedWriter sınıfını kullanacağız. Ama önce oku ile işim bittiği için bu objenin kullandığı dosyaların kullanıma açılması gerekiyor. Bunu da close() metoduyla yapıyorum;
oku.close();
Ardından BufferedWriter için benzer şekilde bir FileWriter oluşturmam gerekiyor. Eğer aynı dosyaya yazmak istiyorsam FileWriter'a yine "dosya" diye tanımladığım d:\yazi.txt'yi içeren File objesini gönderebilirim;
BufferedWriter yaz = new BufferedWriter(new FileWriter(dosya));
Ya da başka bir dosya da belirtebilirim;
BufferedWriter yaz = new BufferedWriter(new FileWriter("d:\\yenidosya.txt"))Ardından write() metoduyla tüm s içeriğini yazdırabilrim;
yaz.write(s);
ve yine bağlantıyı kapatmam gerekiyor;
yaz.close();
Ardından try catch kalıbının try kısmıyla işim bitiyor. Catch içine de hatayı görebilmek için printStackTrace() metodunu yazıyorum;
}catch(Exception e){
e.printStackTrace();
}Aslında bunu iki farklı try catch içine almak daha uygun olurdu. Nerde ne hatası olduğu daha kolay görülebilir kılmak ve programın işlerliğini arttırabilmek için gerekli olan yerleri gerektiği kadar try catch içine almak sizin elinizde.
Son olarak kodu toparlar ve bir main metodu içinde göstermek gerekirse;
package org.hosaf.kod.ioornek;
import java.io.*;
public class OkuDegistirYaz {
public static void main(String[] args) {
BufferedReader oku;
BufferedWriter yaz;
File dosya=new File("d:\\yazi.txt");
String s="";
try{
oku=new BufferedReader(new FileReader(dosya));
while(oku.ready()){
s+=oku.readLine()+"\r\n";
}
s=s.replace("Ahmet", "Mehmet");
oku.close();
yaz=new BufferedWriter(new FileWriter(dosya));
yaz.write(s);
yaz.close();
}catch(Exception e){
e.printStackTrace();
}
}
}Bu Java dosyamızı da OkuDegistirYaz adıyla kaydettiğimizde işlem tamam.
Not: Aynı işlemi farklı metodlarla yapmak da mümkün olabilir. Yani tek yok bu değildir.





Yasin , Java uygulama örneklerin devamını bekleriz,isteyener bu konu için farklı örneklere burdan ulaşabilir.
- cevapla
serpito (Misafir) tarafından Salı, 04/22/2008 - 20:01 tarihinde gönderildi.Bu biraz sahibinden ihtiyaçtan oldu
Biri sormuştu, karınca kararınca cevaplamaya çalıştım.
- cevapla
yasin tarafından Salı, 04/22/2008 - 20:04 tarihinde gönderildi.Merhaba;
Örneğiniz çok güzel ve anlaşılır olumuş. Ancak benim bir önerim olacak. "String s" yerine "StringBuffer" kullansak sizce daha iyi olmaz mı? Bildiğiniz gibi birleştirme (+ veya +=) işlemlerinde StringBuffer çok daha performaslı çalışıyor ve hafıza kullanım mantığı çok daha farklı. Konuyu merak eden arkadaşlar buradan
http://www.acikbilgi.com/2006/01/07/javada-performans-arttirici-yollar-b...
bilgi bulabilirler.
İyi günler
- cevapla
Umit KARADUMAN (Misafir) tarafından Cum, 04/25/2008 - 05:10 tarihinde gönderildi.Katkınız için teşekkürler. Ben de ince ayrıntılarını çok bilmiyorum ama hatırladığım kadarıyla StringBuffer'ı da uygulamalarımızda bolca kullanıyorduk ama özel olarak "hız" sebebi söylenmemişti. Her gün yeni şeyler öğrenmeye devam ediyoruz
Zaten yazıyı da biraz temel bilgi olması açısından yazmıştım. Verdiğiniz bağlantıda daha geniş ve güzel bilgi var. Tekrar teşekkür ederim.
- cevapla
yasin tarafından Cum, 04/25/2008 - 06:16 tarihinde gönderildi.merhaba sormak istediğim bişey var. readLine yerine read kullandıımda sadece tek karakter okutabilmiş olyuorum değil mi?
- cevapla
Misafir - site dışı (Misafir) tarafından Paz, 05/04/2008 - 22:06 tarihinde gönderildi.Evet ama sonuçta int bir değer döner. Yani a karakterini okudu diye sana "a"yı bir char ya da String olarak döndürmez. Onun yerine 0 ile 65535 arasında bir değer alırsın.
Ayrntılı bilgi şurda var;
http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html#read()
- cevapla
yasin tarafından Paz, 05/04/2008 - 22:23 tarihinde gönderildi.Mrb arkadaslar ,
Java ile seri portdan gelen dataları consola yazdırmak istiyorum.
Yardımcı olursanız sevinirim
Teşekürler.
- cevapla
ferit (Misafir) tarafından Çar, 08/06/2008 - 06:09 tarihinde gönderildi.Mrb arkadaslar ,
Java ile seri portdan gelen dataları consola yazdırmak istiyorum.
Yardımcı olursanız sevinirim
Teşekürler.
- cevapla
ferit (Misafir) tarafından Çar, 08/06/2008 - 06:09 tarihinde gönderildi.Yeni yorum gönder