Jan 1, 0001  

title: Java Dersleri 9 - Dosya Okuma/Yazma İşlemleri link: http://orhanbalci.net/tr/?p=226 author: Orhan Balci description: post_id: 226 created: 2009/08/04 13:33:43 created_gmt: 2009/08/04 10:33:43 comment_status: open post_name: java-dersleri-9-dosya-okumayazma-islemleri status: publish post_type: post

Java Dersleri 9 - Dosya Okuma/Yazma İşlemleri

[caption id=“attachment_826” align=“aligncenter” width=“600” caption=“Java Dersleri 9 Dosya İşlemleri”]Java Dersleri 9 Dosya İşlemleri[/caption] Bu derste sizlere Java’nın dosya işlemlerinden bahsedeceğim. Üç bölümlük serinin ilkinde genel dosya girdi çıktı mekanizmasından bahsedip metin dosyalarını nasıl okuyup yazabileceğimize bakacağız. Java’da üm girdi çıktı işlemleri, bu dosya olabilir, network soketi olabilir, Stream (akım) sııfları vasıtasıyla gerçekleştirilir. Stream sınıflarını içerisinden veri akan yollar şeklinde düşünebilirsiniz. Bu sınıflar içerisindeki verilere ve buffering (tamponlama) vs gibi özelliklerine göre birbirlerinden ayrılırlar. Genel olarak taşıdıkları verilere göre üçe ayrılırlar:

  1. İkilik Veri Akımları (Byte Streams) : İkili tipteki dosyaları okuyup yazmakta kullanılırlar
  2. Karakter Akımları(Char Streams): Metin belgeleri okuyup yazmakta kullanılırlar
  3. Nesne Akımları(Object streams): Serializable olan Java nesnelerini okuyup  yazmakta kullanılırlar Bu sınıfların dışında akım sınıflarının özelliklerini değiştiren sarmalayıcı akım sınıfları da mevcuttur. Örneğin BufferedReader sınıfı herhangi bir Reader sınıfını sarmalayarak tamponlama özelliği katar. İlk olarak karakter akımlarını incelemeye çalışalım. Yazılım geliştirme sürecince çokça karşımıza çıkan metin dosyalarını Java’da okumak için Reader soyut sınıfından türeyen InputStreamReader alt sınıfı olan FileReader sınıfı kullanılır. Dosyaya yazmak için ise API’de bu sınıfın muadili FileWriter sınıfı mevcuttur. Örnek olarak herhangi bir metin dosyasının satır başlarına satır numarasını ekleyen şu kod satırlarını inceleyelim: [java] FileWriter fw = null; try { int lineNumber = 1; FileReader fr = new FileReader(fileName); fw = new FileWriter(“linenumber.txt”); int c = fr.read(); do { if ((char) c == ‘\n’) { lineNumber++; fw.write©; fw.write( Integer.toString(lineNumber)); } else { fw.write©; } c = fr.read(); } while (c != -1); } catch (IOException ex) { Logger.getLogger(FileIOUI.class.getName()).log(Level.SEVERE, null, ex); } finally { try { fw.close(); } catch (IOException ex) { Logger.getLogger(FileIOUI.class.getName()).log(Level.SEVERE, null, ex); } } [/java] Metin dosyamızı okumak için FileReader sınıfını kullandık. Öncelikle okumak istediğimiz dosya adını kullanarak bir FileReader nesnesi oluşturup, bu nesne üzerinde read() metodunu çağırdık. Bu sınıfın dosyadan okumak için birden fazla metodu bulunmakla beraber burada dosyayı karakter-karakter okumamızı sağlayan int dönüş değerine sahip olan read() metodunu kullandık. Bu metodun dışarıya verdiği int tipindeki değişken aslında char tipinde bir değişken olduğundan tür dönüşüm operatörünü uygulamamızda bir sakınca yoktur yani : [java] int c = fr.read(); if ((char) c == ‘\n’) { } [/java] kullanımı doğrudur. Burada son olarak dikkat etmemiz gereken husus read() metodunun dosya sonuna geldiğinde değer olarak -1 döndürmesidir. Yani dosya sonuna gelip gelmediğimizi dönüş değerinin -1 olup olmadığını kontrol ederek anlayabiliriz. Metin dosyası yazmak için ise FileWriter sınıfını kullandık. Yine bu sınıfta da dosyaya yazmak için birden fazla metod bulmak mümkün. Biz burada yine karakter-karakter yazmamıza olanak sağlayan write(int) metodunu kullandık. Sadece satır başlarına yazdırmak isediğimiz satır sayısını String tipine dönüştürüp write(String) metodunu kullanarak dosyaya yazdık. Bu iki farklı kullanımı gösterirsek : [java] int c = fr.read(); if ((char) c == ‘\n’) { lineNumber++; fw.write©; fw.write( Integer.toString(lineNumber)); } [/java] Eğer dosyaya en baştan değil sonuna ekleme yapmak istiyorsak FileWriter sınıfının : [java] public FileWriter(File file, boolean append) [/java] yapıcı metodunu kullanabiliriz. Burada ikinci parametreye true değerini vererek dosyaya ekleme yapmak istediğimizi bildirmeliyiz. Metin dosyalarını işlerken genellikle karakter-karakter okuma/yazma yerine kelime-kelime okuma/yazma yada satır okuma/yazma işlemlerini kullanırız. FileReader ve FileWriter sınıfları bu yeteneklere sahip değildir dolayısıyla bunun için sarmalayıcı sınıflar mevcuttur. Bunlar BufferedReader ve BufferedWriter sınıflarıdır. Örneğin bir dosyayı satır satır okumak ve GUI elemanı olan JTextArea’da göstermek için : [java] fr = new FileReader(fileName); BufferedReader bfr = new BufferedReader(fr); String s = “”; do { try { s = bfr.readLine(); jTextArea1.insert(s, jTextArea1.getDocument().getLength() ); jTextArea1.insert(”\n”, jTextArea1.getDocument().getLength() ); } catch (IOException ex) { Logger.getLogger(FileIOUI.class.getName()).log(Level.SEVERE, null, ex); } } while (s != null); [/java] Bu örnekte önemli olan s = bfr.readLine(); fonksiyon çağrımıdır. Bu fonksiyon FileReader sınıfında mevcut değildir. Bu fonksiyon dosyamızdaki satırı bir String nesnesi olarak bize verir. Bu satırı tekrar ayrıştırmak programcıya düşmektedir. Burada sıklıkla ihtiyaç duyulan String fonksiyonları şu derste anlatılmıştır. Buraya kadar anlatmış olduğumuz metodlar dosyaları Java’da ön tanımlı olan karakter kodlamasına göre okur ki bu da içerisinde Türkçe karakter bulunan dosyalarda sıkıntı yaşamamıza sebep olur. Elimizde türkçe yazılmış bir dosya varsa ve bu dosyanın karakter kodlamasını biliyorsak (Türkçe metinler için tanımlanan birden fazla karakter kodlaması vardır) o dosyayı okumamız da gayet kolay olacaktır. Yukarıdaki örneği Türkçe karakterleri okuyacak hale getirelim : [java] fr = new FileInputStream(fileName); InputStreamReader isr = new InputStreamReader(fr,Charset.forName(“ISO-8859-3”)); BufferedReader bfr = new BufferedReader(isr); [/java] Burada FileReader sınıfının yerine InputStreamReader sınıfını kullanmak zorundayız. InputStreamReader nesnemize hangi karakter kodlamasını kullanması gerektiğini söylemeliyiz. Eğer doğru kodlamayı verirsek Türkçe karakterler düzgün bir şekilde okunacaktır. [ad#Yazi Ici Buyuk]

Comments

Dogan: Selamlar, Öncelikle emeğiniz için teşekkürler, şunu sormak istiyorum Dosya okuma işleminde EXCEL gibi bir dosyayı kullandığımızda, Excel dosyası içerisinde bulunan türkçe karakterleri okumak mümkün olmuyor hepsi ? olarak çıkıyor. Bu konuda bir öneriniz olabilirmi?

admin: Doğan bey merhabalar. Excel dosyalarının encodingini bilmiyorum ancak DataInputStream sınıfının read metoduyla dis.read(album, 0, 30); şeklinde okuduğunuz herhangi bir Stringin encodingini new String(album,“iso-8859-9”) String yapılandırma metoduyla değiştirebilirsiniz. Yine de Excel okumak için yazılan JExcel gibi kütüphaneleri kullanmanızı öneririm kolay gelsin.

pentagRammstein: Merhabalar paylaşım için teşekkür ederim.Ancak benim aradığım konu biraz daha farklı.C programlama dilinde kullanılan konumlandırma fonksiyonu fseek javada yok,ama fseek fonksiyonunun görevini yapan başka bir kullanım şekli olmalı diye düşünüyorum.Bir türlü bulamadım,javada fseek kullanımına benzer bir kullanım varmı? Varsa nasıl kullanılır ? (fseek fonksiyonu özetle şu işi yapıyor; Dosya okuma esnasında program dışarıdan girilen bir değeri alarak o sayıdan sonraki byteları okuyor,örneğin 100 byte lık veriyi atlıyor ve 101.byte tan itibaren okumaya başlıyor.Burada zamandan birkazanım söz konusu çünkü ilk 100 byte lık veriyi okumuyor) Şimdiden çok teşekkürler…

admin: İkilik (binary) dosyaları okumaya yarayan DataInputStream sınıfının skipBytes() metodu işinizi görecektir.

Gürcan Kavakçı: Teşekkürler, Güzel paylaşım

sd: txt yerine exe dosyasını nasıl yapabiliriz. Dosya yazdıktan sonra açılabilir olacak

pyk: merhaba ben 2 tane text dosyasını okuyup bunları gui elemanı olarak 2 dosyayı ekrana gösterip iki dosyada aynı kelimeler kullanılmışsa bunları bold yapmak istiyorum bu konuda yardımcı olabilirmisiniz

admin: Merhabalar. Ekranda gösterim için JTextPane kullanırsınız. Dosyaları okurken kelime kelime okuyup bunları bir set(TreeSet olabilir) veri tipine kaydedip teker teker gezinip diğer dosyaya ait set içinde var mı kontrolü yaparsınız.