BİL-141 Bilgisayar Programlama I (Java) TOBB Ekonomi ve Teknoloji Üniversitesi Bilgisayar Mühendisliği Bölümü Not: Bu dersin sunumları, M. Ali Akcayol tarafından “Java Bilgisayar Programlamaya Giriş, A. Yazıcı, E. Doğdu, M. Özbayoğlu, M. Erten, O. Ergin” kitabı kullanılarak hazırlanmıştır. Konular Akımlar ve Dosya Giriş/Çıkış İşlemleri n Metin Dosyaları ve İkili Dosyalar n Metin Dosyaları Giriş/Çıkış İşlemleri n PrintWriter Sınıfı n BufferedReader Sınıfı n File Sınıfı n 1 Akımlar ve Dosya Giriş/Çıkış İşlemleri n n n n Giriş/Çıkış (G/Ç) bir programa giren ve çıkan verilerin genel gösterimine denir. Bir programa giriş klavyeden veya dosyadan yapılabilir. Programın çıktısı ise ekrana veya dosyaya yapılabilir. Eğer giriş/çıkış işlemleri dosya ile iletişim gerektiriyorsa Java’da bu işlemlere yönelik hazırlanmış özel sınıf ve nesnelerin kullanılması gerekir. 3 Akımlar ve Dosya Giriş/Çıkış İşlemleri Akımlar (Streams) n Java’da dosya işlemleri akımlar aracılığıyla yapılır. n Eğer veriler dışarıdan programa geliyorsa buna giriş akımı (input stream), programdan dışarı gidiyorsa buna çıkış akımı (output stream) denir. n Java’da akım programa giriş/çıkış yapan verilerin kaynaklarını (klavye, dosya) ve varış noktalarını (ekran, dosya) düzenleyen nesne olarak görev yapmaktadır. n System.out nesnesi verileri ekrana yazan bir çıkış akımına, Scanner nesnesi de verileri klavyeden alan bir giriş akımına örnek olarak gösterilebilir. n Dosya G/Ç işlemlerinin yapılabilmesi için giriş ve çıkış akımları dosya ile ilişkilendirilirler. 4 2 Akımlar ve Dosya Giriş/Çıkış İşlemleri Dosya G/Ç işleminin gerekliliği n Program sona erdiğinde kullanılan veriler kaybolur. n Verileri kaybetmemek için dosyada saklanması gereklidir. n Aynı şekilde klavyeden girilen verilerin de program çalıştırıldığında tekrar tekrar girilmesi yerine kaydedilip tekrar çalıştırıldığında okunarak elde edilmesi gerekir. 5 Konular Akımlar ve Dosya Giriş/Çıkış İşlemleri n Metin Dosyaları ve İkili Dosyalar n Metin Dosyaları Giriş/Çıkış İşlemleri n PrintWriter Sınıfı n BufferedReader Sınıfı n File Sınıfı n 3 Metin Dosyaları ve İkili Dosyalar n n n n Bilgisayar ortamında dosyalarda saklanan veriler 0 ve 1’lerden oluşur. Dosyalar içerik olarak metin dosyası ve ikili dosya olmak üzere iki çeşittir. Metin dosyaları System.out nesnesi ile kaydedilen ve herhangi bir metin düzenleyicisi tarafından içeriği okunabilen dosyalardır. İkili dosyalar ise bilgilerin ikili olarak saklandığı ve görüntü, fotoğraf, müzik veya video gibi özel yapıya sahip dosyalardır. Bu dosyalar metin düzenleyici programlarla açılamazlar. 7 Metin Dosyaları ve İkili Dosyalar - devam n n n Metin dosyaları kullanıcıların okuyabilmesi, ikili dosyalar ise bilgisayarların okuyabilmesi için hazırlanmış olarak düşünebilir. Metin dosyaları herhangi bir bilgisayarda aynı şekilde okunabilir. İkili dosyaları okuyabilmek için özel programlara ihtiyaç vardır. 8 4 Konular Akımlar ve Dosya Giriş/Çıkış İşlemleri n Metin Dosyaları ve İkili Dosyalar n Metin Dosyaları Giriş/Çıkış İşlemleri n PrintWriter Sınıfı n BufferedReader Sınıfı n File Sınıfı n Metin Dosyaları Giriş/Çıkış İşlemleri n n n n Java’da metin dosyası çıkış işlemleri Prinwriter ve FileOutputStream sınıfları kullanılarak yapılır. Dosya çıkış işlemleri için bu sınıflar ile bir output stream oluşturulur. Giriş işlemleri ise BufferedReader ve FileReader sınıfları kullanılarak yapılır. Dosya giriş işlemleri için bu sınıflar ile bir input stream oluşturulur. 10 5 Konular Akımlar ve Dosya Giriş/Çıkış İşlemleri n Metin Dosyaları ve İkili Dosyalar n Metin Dosyaları Giriş/Çıkış İşlemleri n PrintWriter Sınıfı n BufferedReader Sınıfı n File Sınıfı n PrintWriter Sınıfı n n Java’da bir metin dosyasına çıktı gönderebilmek için java.io kütüphanesinin içinde yer alan PrintWriter sınıfına ait println metodu kullanılır. Java’da PrintWriter sınıfını programda kullanabilmek için import java.io.* ile import edilmesi gereklidir. 12 6 PrintWriter Sınıfı // Metin dosyasi olusturulmasi örnek programi import java.io.*; import java.util.*; public class OrnekCikisMetinDosyasi { public static void main(String[] args) { PrintWriter ciktiAkimi = null; String dosya = "ornek.txt"; try { ciktiAkimi = new PrintWriter (new FileOutputStream(dosya)); } 13 PrintWriter Sınıfı catch (FileNotFoundException hata) { System.out.println("ornek.txt dosyasi olustururken hata oldu"); System.exit(0); // Programdan normal çıkış. } System.out.print("Bir ornek cumle giriniz:"); Scanner klavye = new Scanner(System.in); String cumle = klavye.nextLine(); ciktiAkimi.println("Klavyeden girdiginiz cumle: " + cumle); ciktiAkimi.println("Dosyayi kapatabiliriz."); ciktiAkimi.close(); System.out.println("Girilen cumle ornek.txt dosyasina yazildi."); } } Ekran Çıktısı: Bir ornek cumle giriniz: Ben Java kitabı okuyorum Girilen cumle ornek.txt dosyasina yazildi. Metin dosyasının içeriği Klavyeden girdiginiz cumle: Ben Java kitabı okuyorum Dosyayi kapatabiliriz. 14 7 PrintWriter Sınıfı n n n n n n Örnekte dosyaya çıktı göndermek için PrintWriter sınıfına ait ciktiAkimi nesnesi oluşturulmuştur. Program bu satırı çalıştırırken eğer ornek.txt dosyası varsa, varolan dosyanın içeriği silinip yeni içerik olarak gönderilen metin yazılır. Eğer ornek.txt dosyası yoksa, yeni bir dosya oluşturulup gönderilen metin yazılır. Örnekte PrintWriter nesne kurucusuna FileOutputStream sınıfına ait bir nesne gönderilmiştir. FileOutputStream nesne kurucusu ise parametre olarak String türünde bir değer almaktadır ve dosyanın adını göstermektedir. Dosya isimleri seçerken Java’da kullanılan isimlendirme kuralları değil işletim sistemleri kuralları geçerlidir. 15 PrintWriter Sınıfı n n n n n Java’da dosya işlemleri sırasında FileNotFoundException kural dışı durumu oluşabilir. Kural dışı durumu yakalamak için try-catch bloğu kullanılmalıdır. Buradaki kural dışı durum sadece dosya açma işlemi yapan FileOutputStream nesne kurucusundan kaynaklanabilir. Bu yüzden try bloğu içerisine alınmalıdır. FileNotFoundException tipi kural dışı durum, IOException sınıfına ait özel bir kural dışı durumdur. Aşağıdaki satır ile PrintWriter sınıfına ait println() metoduyla dosyaya yazma yapılmaktadır. ciktiAkimi.println("Klavyeden girdiginiz " + cumle); cumle: 16 8 PrintWriter Sınıfı PrintWriter sınıfı metotları Metot tanımı Açıklama boolean checkError () Akımın hata durumunu verir. void close () Akımı kapatır. void flush () Akımın içeriğini temizler. void print (boolean b) Bir Boolean değişkenini akıma yazar. void print (char c) Bir karakter (char) değişkenini akıma yazar. void print (char [] s) Bir karakter (char) dizisini akıma yazar. void print (double d) Bir ondalıklı sayı (double) değişkenini akıma yazar. void print (float f) Bir ondalıklı sayı (float) değişkenini akıma yazar. void print (int i) Bir tamsayı (int) değişkenini akıma yazar. 17 PrintWriter Sınıfı PrintWriter sınıfı metotları - devam Metot tanımı Açıklama void print (long l) Bir büyük tamsayı (long) değişkenini akıma yazar. void print (Object o) Bir nesneyi akıma yazar. Nesnenin toString() metodunu kullanır. void print (String s) Bir dizgi (String) değişkenini akıma yazar. void println() Satır sonu yaparak yeni satıra geçer. void println(boolean b) Bir Boolean değişkenini akıma yazar ve satırı sona erdirir. void println(char c) Bir karakter (char) değişkenini akıma yazar ve satırı sona erdirir. void println(char [] s) Bir karakter (char) dizisini akıma yazar ve satırı sona erdirir. void println(double d) Bir ondalıklı sayı (double) değişkenini akıma yazar ve satırı sona erdirir. 18 9 PrintWriter Sınıfı PrintWriter sınıfı metotları - devam Metot tanımı Açıklama void println(float f) Bir ondalıklı sayı (float) değişkenini akıma yazar ve satırı sona erdirir. void println(int i) Bir tamsayı (int) değişkenini akıma yazar ve satırı sona erdirir. void println(long l) Bir büyük tamsayı (long) değişkenini akıma yazar ve satırı sona erdirir. void println(Object o) Bir nesneyi akıma yazar ve satırı sona erdirir. void println(String s) Bir dizgi (String) değişkenini akıma yazar ve satırı sona erdirir. void setError() Eğer bir hata gerçekleşmişse bu metot hata olduğunu belirtir. void write(char [] buf) Bir karakter (char) dizisini akıma yazar. 19 PrintWriter Sınıfı PrintWriter sınıfı metotları - devam Metot tanımı Açıklama void write(char [] buf, int off, int len) Bir karakter (char) dizisinin off ile belirtilen sıradaki karakterinden başlar len ile belirtilen kadar karakterini akıma yazar. void write(int c) Tek bir karakteri (char) akıma yazar. void write(String s) Bir dizgiyi (String) akıma yazar. void write(String s, int off, int len) Bir dizginin (String) off ile belirtilen sıradaki karakterinden başlar len ile belirtilen kadar karakterini akıma yazar. 20 10 PrintWriter Sınıfı n n n n n Java’da bir dosya açıldığında, bu dosyayla ilgili işlemler bitince dosyanın close(); ile kapatılması gerekir. ciktiAkimi.close(); Java’da varolan bir dosya metin dosyası üzerinde değişiklik yapmak istenirse, PrintWriter sınıfına overload yapılmış başka bir kurucuyu kullanmak gerekir. ciktiAkimi = new PrintWriter(new FileOutputStream(dosya, true)); İkinci parametre dosyaya ekleme yapılıp yapılmayacağını belirler. true ise dosyaya ekleme yapılacağı bildirilir. Bir dosya açılmadan önce var olup olmadığı File sınıfına ait exists() metoduyla kontrol edilir. Bir nesneye ait bilgiler toString() ile yazdırılır. 21 PrintWriter Sınıfı n Aşağıdaki örnekte Araba sınıfının toString() metodu kullanılarak yazma işlemi yapılmıştır. // toString() metodunun kullanimi public class Araba { private String renk; private int beygirGucu; private int hiz; public Araba(String renk, int guc, int hiz) { this.renk = renk; this.beygirGucu = guc; this.hiz = hiz; } 22 11 PrintWriter Sınıfı public void setRenk(String renk) { this.renk = renk; } public void setBeygirGucu(int guc) { this.beygirGucu = guc; } public void setHiz(int hiz) { this.hiz = hiz; } 23 PrintWriter Sınıfı public String toString() { String ozellikler = null; ozellikler += “Renk = “ + this.renk + “\n”; ozellikler += “Beygir Gucu = “ + this.beygirGucu + “\n”; ozellikler += “Hiz = “ + this.hiz + “\n”; return (ozellikler); } 24 12 PrintWriter Sınıfı public boolean equals(Araba yeniAraba) { boolean ayniAraba = false; // Iki arabanin bütün özellikleri ayni ise // bu iki araba birbirine esittir diyebiliriz. if (yeniAraba.renk == this.renk) if (yeniAraba.beygirGucu == this.beygirGucu) if (yeniAraba.hiz == this.hiz) ayniAraba = true; return ayniAraba; } } 25 PrintWriter Sınıfı n Araba sınıfının toString() metoduyla dosyaya yazma işlemi. // toString() metoduna sahip Araba sinifinin kullanimi import java.io.*; public class DeneAraba { public static void main(String[] args) { PrintWriter ciktiAkimi = null; String dosya = "ornekAraba.txt"; try { ciktiAkimi = new PrintWriter (new FileOutputStream(dosya)); } 26 13 PrintWriter Sınıfı catch (FileNotFoundException hata) { System.out.print("ornekAraba.txt dosyasi "); System.out.println("olustururken hata oldu"); System.exit(0); } Araba ferrari = new Araba("kirmizi",450,320); Araba fiat = new Araba("beyaz",75,145); Araba opel = new Araba("mavi",150,200); ciktiAkimi.println("Ferrari ozellikleri"); ciktiAkimi.println(ferrari.toString()); ciktiAkimi.println(); ciktiAkimi.println("Fiat ozellikleri"); ciktiAkimi.println(fiat.toString()); ciktiAkimi.println(); ciktiAkimi.println("Opel ozellikleri"); 27 PrintWriter Sınıfı ciktiAkimi.println(opel.toString()); ciktiAkimi.println(); System.out.print("Araba ozellikleri ornekAraba.txt"); System.out.println(" dosyasina yazildi."); } } Çıktı: Araba özellikleri ornekAraba.txt dosyasina yazildi. Metin dosyasının içeriği Ferrari özellikleri Renk: kirmizi Beygir gucu: 450 Hiz: 320 Fiat özellikleri Renk: beyaz Beygir gucu: 75 Hiz: 145 Opel özellikleri Renk: mavi Beygir gucu: 150 Hiz: 200 28 14 Konular Akımlar ve Dosya Giriş/Çıkış İşlemleri n Metin Dosyaları ve İkili Dosyalar n Metin Dosyaları Giriş/Çıkış İşlemleri n PrintWriter Sınıfı n BufferedReader Sınıfı n File Sınıfı n BufferedReader Sınıfı n n n Java’da bir metin dosyasından okuma yapmak için java.io kütüphanesinin içinde yer alan BufferedReader sınıfı kullanılır. BufferedReader sınıfına ait bir nesne oluştururken metin dosyasının adı doğrudan girilmez. FileReader adlı bir sınıftan oluşturulan nesne kullanılır. Metin dosyasından bir satır okumak için readLine() metodu kullanılır. 30 15 BufferedReader Sınıfı // Metin dosyasi giris örnegi import java.io.*; public class OrnekGirisMetinDosyasi { public static void main(String[] args) { try { BufferedReader girisAkimi = new BufferedReader(new FileReader("ornek.txt")); String satir = null; satir = girisAkimi.readLine( ); System.out.print("ornek.txt dosyasinin 1. satirinda:"); System.out.println("\"" + satir + "\" yazmaktadir. "); satir = girisAkimi.readLine( ); System.out.print("ornek.txt dosyasinin 2. satirinda:"); System.out.println("\"" + satir + "\" yazmaktadir."); girisAkimi.close( ); 31 } BufferedReader Sınıfı catch(FileNotFoundException e) { System.out.print("ornek.txt dosyasi bulunamadi"); System.out.println("veya acilamadi."); } catch(IOException e) { System.out.print("ornek.txt dosyasindan veri girisinde"); System.out.println(" hata olustu."); } } } Ekran Çıktısı: ornek.txt dosyasinin 1.satirinda “Bir ornek cumle giriniz: Ben Java kitabi okuyorum” yazmaktadir. ornek.txt dosyasinin 2.satirinda “Dosyayi kapatabiliriz.” yazmaktadir. Metin dosyasının içeriği Bir ornek cumle giriniz: Ben Java kitabi okuyorum Dosyayi kapatabiliriz. 32 16 BufferedReader Sınıfı n n n Metin girdisi elde etme işlemi yapısal olarak metin çıktısı elde etme işlemine benzemektedir. Metin girdisinde iki ayrı kural dışı durum oluşabileceğinden try bloğuyla iki ayrı catch bloğu kullanılmıştır. Dosyanın açılamaması durumunda FileNotFoundException, dosya okuma hatası oluşması durumunda ise IOException kural dışı durum oluşur. 33 BufferedReader Sınıfı n n n n BufferedReader sınıfı metin dosyasından bir satır okur ancak satırın içeriği hakkında bilgi vermez. Okunan satır String olarak saklanır. Okunan satırın parçalara ayrılıp ayrı ayrı kullanılması için StringTokenizer adındaki sınıf kullanılır. StringTokenizer st = new StringTokenizer("this is a test"); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } Bir metin dosyasından tüm bilgilerin okunması için döngü oluşturulur. Tüm satırlar bitince readLine() metodu null değeri döndürür. 34 17 BufferedReader Sınıfı //Döngü kullanarak giriş yapılan bir metin dosyasi örnegi import java.io.*; public class OrnekGirisMetinDosyasi { public static void main(String[] args) { try { BufferedReader girisAkimi = new BufferedReader(new FileReader("ornek.txt")); String satir = null; int sayac = 0; satir = girisAkimi.readLine( ); while (satir != null) { sayac++; System.out.print("ornek.txt dosyasinin " + sayac); System.out.print("satirinda:" + sayac); System.out.println("\"" + satir + "\" yazmaktadir. "); satir = girisAkimi.readLine( ); } 35 BufferedReader Sınıfı girisAkimi.close( ); } catch(FileNotFoundException e) { System.out.print("ornek.txt dosyasi bulunamadi"); System.out.println("veya acilamadi."); } catch(IOException e) { System.out.print("ornek.txt dosyasindan veri girisinde"); System.out.println(" hata olustu."); } } } 36 18 Konular Akımlar ve Dosya Giriş/Çıkış İşlemleri n Metin Dosyaları ve İkili Dosyalar n Metin Dosyaları Giriş/Çıkış İşlemleri n PrintWriter Sınıfı n BufferedReader Sınıfı n File Sınıfı n File Sınıfı n n Java’da bir metin dosyası giriş ve çıkış işlemleri PrintWriter ve BufferedReader sınıfları kullanılarak yapılır. Ancak bu sınıflar dosyanın genel özellikleriyle ilgili meotlara sahip değildirler. Bir klasörde herhangi bir dosyanın olup olmadığı, okunup okunamayacağı gibi durumlar File sınıfı ile kontrol edilebilir. 38 19 BufferedReader Sınıfı //Döngü ve File kullanarak giris yapilan bir metin dosyasi örnegi import java.io.*; import java.util.*; public class OrnekGirisMetinDosyasi2 { public static void main(String[] args) { do { System.out.println("Okumak istediginiz dosya adini giriniz."); Scanner klavye = new Scanner(System.in); String dosya = klavye.next(); File dosyaNesnesi = new File(dosya); if ( !dosyaNesnesi.exists()) System.out.println("Bu isimde bir dosya yok."); else if ( !dosyaNesnesi.canRead()) System.out.println("Bu dosya okunamiyor."); } while ((!dosyaNesnesi.exists()) || !dosyaNesnesi.canRead())); 39 BufferedReader Sınıfı try { BufferedReader girisAkimi = new BufferedReader(new FileReader(dosyaNesnesi)); String satir = null; int sayac = 0; satir = girisAkimi.readLine(); while (satir != null) { sayac++; System.out.print("ornek.txt dosyasinin " + sayac); System.out.print(". satirinda:"); System.out.println("\"" + satir + "\" yazmaktadir."); satir = girisAkimi.readLine( ); } girisAkimi.close( ); } 40 20 BufferedReader Sınıfı catch(FileNotFoundException e) { System.out.print("ornek.txt dosyasi bulunamadi"); System.out.println("veya acilamadi."); } catch(IOException e) { System.out.print("ornek.txt dosyasindan veri girisinde"); System.out.println(" hata olustu."); } } } 41 File Sınıfı n n Örnekte BufferedReader nesne kurucusuna, parametre olarak gönderilen FileReader nesne kurucusu gönderilmiştir. FileReader nesne kurucusuna dosya ismi olarak String gönderilebileceği gibi, bir File nesnesi de (örnekte dosyaNesnesi) gönderilebilir. 42 21 PrintWriter Sınıfı File sınıfının bazı metotları Metot tanımı Açıklama boolean exists() Metodu çağıran dosyanın klasörde olup olmadığını kontrol eder. boolean canRead() Metodu çağıran dosyanın okunup okunamayacağını dosya özelliklerine göre belirler. boolean canWrite() Metodu çağıran dosyaya yazaılıp yazılamayacağını dosya özelliklerine göre belirler. boolean delete() Metodu çağıran dosyayı silmeye çalışır. Silme başarılı ise true değilse false döndürür. long length() Metodu çağıran dosyanın byte cinsinden uzunluğunu verir. String getName() Metodu çağıran dosyanın ismini verir. String getPath() Metodu çağıran dosyanın bilgisayar üzerindeki yolunu (path) verir. 43 22