Algorithms and Data Structures

advertisement
BİL-141 Bilgisayar Programlama I
(Java)
Hazırlayan: M.Ali Akcayol
Gazi Üniversitesi
Bilgisayar Mühendisliği Bölümü
Not: Bu dersin sunumları, “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
Metin Dosyaları ve İkili Dosyalar
Metin Dosyaları Giriş/Çıkış İşlemleri
PrintWriter Sınıfı
BufferedReader Sınıfı
File Sınıfı
1
Akımlar ve Dosya Giriş/Çıkış İşlemleri




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)
 Java’da dosya işlemleri akımlar aracılığıyla yapılır.
 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.
 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.
 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.
 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
 Program sona erdiğinde kullanılan veriler kaybolur.
 Verileri kaybetmemek için dosyada saklanması gereklidir.
 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
Metin Dosyaları ve İkili Dosyalar
Metin Dosyaları Giriş/Çıkış İşlemleri
PrintWriter Sınıfı
BufferedReader Sınıfı
File Sınıfı
3
Metin Dosyaları ve İkili Dosyalar




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



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
Metin Dosyaları ve İkili Dosyalar
Metin Dosyaları Giriş/Çıkış İşlemleri
PrintWriter Sınıfı
BufferedReader Sınıfı
File Sınıfı
Metin Dosyaları Giriş/Çıkış İşlemleri




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
Metin Dosyaları ve İkili Dosyalar
Metin Dosyaları Giriş/Çıkış İşlemleri
PrintWriter Sınıfı
BufferedReader Sınıfı
File Sınıfı
PrintWriter Sınıfı


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ı






Ö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ı





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ı
boolean checkError ()
Açıklama
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.
Akımın hata durumunu verir.
17
PrintWriter Sınıfı
PrintWriter sınıfı metotları - devam
Metot tanımı
void print (long l)
Açıklama
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.
Bir büyük tamsayı (long) değişkenini
akıma yazar.
18
9
PrintWriter Sınıfı
PrintWriter sınıfı metotları - devam
Metot tanımı
void println(float f)
Açıklama
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.
Bir ondalıklı sayı (float) değişkenini
akıma yazar ve satırı sona erdirir.
19
PrintWriter Sınıfı
PrintWriter sınıfı metotları - devam
Metot tanımı
void write(char [] buf, int
off, int len)
Açıklama
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.
Bir karakter (char) dizisinin off ile
belirtilen sıradaki karakterinden başlar len
ile belirtilen kadar karakterini akıma yazar.
20
10
PrintWriter Sınıfı





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ı

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ı

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
Metin Dosyaları ve İkili Dosyalar
Metin Dosyaları Giriş/Çıkış İşlemleri
PrintWriter Sınıfı
BufferedReader Sınıfı
File Sınıfı
BufferedReader Sınıfı



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ı



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ı




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
Metin Dosyaları ve İkili Dosyalar
Metin Dosyaları Giriş/Çıkış İşlemleri
PrintWriter Sınıfı
BufferedReader Sınıfı
File Sınıfı
File Sınıfı


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ı


Ö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ı
boolean exists()
Açıklama
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.
Metodu çağıran dosyanın klasörde olup
olmadığını kontrol eder.
43
22
Download