Java Programlama Giriş/Çıkış
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.
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.
Metin Dosyaları Giriş/Çıkış İşlemleri Java’da metin dosyası çıkış işlemleri Printwriter 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.
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.
Çıkış İşlemleri PrintWriter FileOutputStream Hafıza Disk ÇıkışAkımı ornek.txt PrintWriter cıkısakımı = new PrintWriter( new FileOutputStream(“ornek.txt”) );
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)); }
catch (FileNotFoundException hata) { System. out. println("ornek catch (FileNotFoundException hata) { System.out.println("ornek.txt dosyasi olustururken hata oldu"); System.exit(0); } 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.
Ö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ından 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.
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);
PrintWriter sınıfı metotları
ciktiAkimi = new PrintWriter(new FileOutputStream(dosya, true)); 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 İ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.
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 dosya 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.
BufferedReader sınıfı metin dosyasından bir satır okur ancak atı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. 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.
Giriş İşlemleri BufferedReader FileReader Hafıza Disk girisakımı ornek.txt BufferedReader girisakımı = new BufferedReader( new FileReader(“ornek.txt”) );
Örnek: StringTokenizer Aşağıdaki karakterlerle ayrılmış kelimeleri gösterir: space, new line (\n), period (.) or comma (,). String inputLine = keyboard.nextLine(); StringTokenizer wordFinder = new StringTokenizer(inputLine, " \n.,"); while(wordFinder.hasMoreTokens()) { System.out.println(wordFinder.nextToken()); } Question 2b or !tooBee Giriş "Question,2b.or !tooBee." çıktı:
import java.util.StringTokenizer; public class App { public static void main(String[] args) { String Stut[]=new String[9]; String str = "This 10 String split, by StringTokenizer created by BLGM416"; StringTokenizer st = new StringTokenizer(str," ,"); int i=0; while (st.hasMoreElements()) { Stut[i]=st.nextToken(); System.out.println(Stut[i]); i++; }
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.
File sınıfının bazı metotları
Temel Binary (ikili 01) Dosyalar Binary bir dosyaya çıktı: ObjectOutputStream FileOutputStream Binary bir dosyadan giriş: ObjectInputStream FileInputStream FileOutputStream ve FileInputStream dosya isimlerini parametre olarak alırlar. Busınıfları kullanmak için aşağıdaki paket kullanılır: import java.io.*;
Yeni bir Binary çıktı dosyası oluşturma Dosya ismi String olarak verilir: Çıktı dosyası oluşturmak için: 1. FileOutputStream nesnesi dosya ismi ile ilişkilendirilir String Daha sonra FileOutputStream ObjectOutputStream nesnesine bağlanır
Örnek Veya ObjectOutputStream outputStream = new ObjectOutputStream( new FileOutputStream("numbers.dat")); Veya FileOutputStream middleman = new FileOutputStream("numbers.dat"); ObjectOutputStream outputStream = new ObjectOutputSteam(middleman); writeInt(int n) writeDouble(double x) writeBoolean(boolean b) etc.
ObjectInputStream inStream = new ObjectInputStream (new FileInputStream("numbers.dat")); Veya FileInputStream middleman = new FileInputStream("numbers.dat"); ObjectInputStream inputStream = new ObjectInputStream (middleman); readInt() readDouble() readBoolean() etc.
Javada Input/Output Dosya İşlemleri File Sınıfı; Bu sınıf dosyaya okuma yazma işlemleri yapmamız için yeterli değildir. Sadece dosya hakkında kullanışlı bilgiler elde etmemizi sağlar. Java dosyaları birer byte Streami olarak görür. Dosyalar end of file işaretcisi yada özel bir byte nuamarıyla sonlanır. Dosya işlemi gerçekleştirilirken dosya için bir byte stream nesnesi oluşturulur. Java da dosya işlemlerini gerçekleştirebilmek için projeye java.io paketini import etmemiz gerekir. Bu paket içerisinde FileInputStream(byte tabanlı input), FileOutputStream(byte tabanlı output), FileReader(karakter tabanlı input) ve FileWriter(karakter tabanlı output) sınıflarını içerir. Aynı zamanda Java da dosya okuma işlemlerinde psrformans artışı sağlamak için buffering kullanılır. Bu yapıda tüm outputlar belleğin buffer isimli bir bölümüne kopyalanırlar. Bufferlama işlemi için de BufferedOutputStream(dosya çıktısını bufferlar) ve BufferedInputStream(dosya girdisini bufferlar) classları mevcuttur.
File Sınıfı-Örnek Javada Input/Output public class FileHakkinda { public static void main(String[] args) { // tam yolu tanımlayalım String path = "E:\\ornek.txt"; File file = new File(path); //verilen yol doğru mu değil mi? if(file.exists()) if(file.isFile()) System.out.println(file.getName() + " - bir dosyadır"); } System.out.println(file.length() + " - boyutu"); System.out.println(file.lastModified() + " - en son düzenlenme tarihi"); System.out.println(file.getPath() + " - yolu (path)"); if(file.isDirectory()) System.out.println(file.getName() + " - bir klasördür"); System.out.println("ve bu klasör içerisindeki dosyalar :"); String[] klasor = file.list(); for(String dosya : klasor) System.out.print(dosya + " "); System.out.println(""); else System.out.println("Böyle bir yol mevcut değildir."); } } }
FileInputStream-DosyaOkuma-Örnek Javada Input/Output FileInputStream-DosyaOkuma-Örnek public class Okuma { public static void main(String[] args) { int i; boolean eof = false; try { FileInputStream f = new FileInputStream("E:\\filmlerim.txt"); // do { while (!eof){ i = f.read(); if (i != -1) { System.out.print((char)i); } // } while (i != -1); } catch (IOException e) { System.out.println("Dosya acilamadi"); } }
BufferedReader-DosyaOkuma-Örnek Javada Input/Output BufferedReader-DosyaOkuma-Örnek public class Okuma2 { public static void main(String[] args) throws IOException { File file = new File("E:\\filmlerim.txt"); BufferedReader reader = null; reader = new BufferedReader(new FileReader(file)); String satir = reader.readLine(); while (satir!=null) { System.out.println(satir); satir = reader.readLine(); }
BufferedWriter-DosyayaYazma-Örnek Javada Input/Output BufferedWriter-DosyayaYazma-Örnek public class Yazma { public static void main(String[] args) { String giris; BufferedReader oku = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Lutfen adinizi soyadinizi girin:"); try { giris = oku.readLine(); //BufferedWriter fw = new BufferedWriter (new FileWriter("E:\\yaz.txt")); FileWriter fw = new FileWriter(new File("E:\\yaz.txt")); //PrintWriter out = new PrintWriter (fw); //out.println(giris); fw.write(giris); System.out.println(giris + " Dosyaya yazildi"); fw.close(); } catch (IOException e) { }