BİL-141 Bilgisayar Programlama I (Java)

advertisement
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
Download