Java Scanner ve Formatter Sınıfları ile Dosya İşlemleri

Java I/O kütüphaneleri birçok farklı veri kaynağı ile işlem yapabilmek için geliştirilmiş bir yapıya sahiptir.

Veri kaynağı, işletim sisteminde bulunan bir dosya (file) olabileceği gibi, ağ üzerinde bulunan uzak bir bilgisayar da olabilir. Java geliştiricileri için bu tür input (girdi) output (çıktı) işlemlerinin detayı esasen çok da önemli değildir. Herhangi bir veri kaynağını, Java’nın sunmuş olduğu I/O sınıfları ile ele alabilirsiniz.

Bu yazıda, Java I/O kütüphanelerini kulanarak işletim sistemi üzerinde bulunan dosyalar ile nasıl veri giriş çıkışı yapılacağını anlatmaya çalışacağım. Bunun için kullanacağımız sınıflar java.util paketi içerisinde bulunan Scanner ve Formatter sınıfları.

Scanner ve Formatter Sınıfları

Bilindiği gibi Scanner, bir veri kaynağından alınan verileri okumak için kullanılan oldukça gelişmiş bir Java sınıfıdır. Scanner, konsol üzerinden kullanıcıdan veri almanın yanında, herhangi bir dosya ile de çalışabilir. Sonuçta konsol ve dosya da birer veri kaynağıdır. Yapmamız gereken tek şey, Scanner nesnesini oluştururken dosya sistemi ile çalışacağımızı belirten uygun yapılandırıcıya (constructor) uygun nesneleri geçirmektir.

Örneğin, Scanner ile konsol üzerinden veri okumak için, yapılandırıcıya varsayılan akış nesnesini geçirmek yeterlidir. System.in varsayılan olarak konsol üzerinden gelen veriyi okur.

Scanner input = new Scanner(System.in);

Aynı şekilde, bir dosya üzerinden veri okumak için, Scanner nesnesine bir dosya kaynağını temsil eden nesneyi geçirmek yeterlidir.

Scanner input = new Scanner(new BufferedReader(new FileReader("mail.txt")));

Burda dikkat etmemiz gereken tek şey, bir dosya akışını FileReader nesnesi ile ele alıyoruz. FileReader sınıfı, dosyadan karakter tabanlı akışları okumak için özelleştirilmiş bir sınıftır. FileReader nesnesine, işlem yapmak istediğimiz dosya adını string olarak geçirerek, dosya kaynağını FileReader nesnesi ile ilişkilendiriyoruz. Ancak FileReader nesnesi, veri okuma işini performanssız bir şekilde ele aldığından bu nesneyi daha performanslı olan BufferedReader nesnesine parametre olarak aktarmak çok daha yaygın bir kullanış şeklidir. Performans detaylarını bu yazıda ele almayacağımız için bu konuya daha fazla girmeyeceğim.

Nihayetinde, BufferedReader nesnesini de Scanner nesnesine parametre olarak geçirerek, Scanner nesnesini bir dosya kaynağı ile kullanmaya başlayabiliriz.

Formatter sınıfı da, Scanner gibi benzer işlevler için tasarlanmıştır. Uygulama içerisindeki biçimlendirilmiş bir veriyi herhangi bir veri kaynağına yazdırmak için Formatter sınıfı kullanılabilir. Yine Formatter nesnesini oluştururken, hedef kaynağı bir dosya ile ilişkilendiren Java nesnesini parametre olarak geçirerek, dosya yazma işlemini tamamlayabiliriz.

Formatter output = new Formatter(new BufferedWriter(new FileWriter("mail.txt")));

Artık bir dosya ile veri giriş çıkışını yapan uygulamamızı geliştirmeye başlayabiliriz.

Uygulama Şablonu

Geliştireceğimiz uygulama, mail.txt adında bir dosyaya, kullanıcıdan alınan mail adreslerini yazan FileInput sınıfı ve mail.txt dosyasında bulunan verileri okuyup ekrana basan FileOutput adlı iki temel sınıfdan oluşmaktadır. Ayrıca bu sınıfları uygulamaya geçiren main methoduna sahip FileTest sınıfı ile dosya işlemlerini başlatan bir başka sınıfa daha sahiptir.

Bu uygulama sayesinde Scanner sınıfı ile hem konsoldan hem de dosya üzerinden nasıl veri okunduğunu görebilirsiniz.

Öncelikle FileOutput sınıfını geliştirelim.

/**
FileOutput.java
Kullanıcıdan alınan verileri sırası ile
mail.txt dosyasına yazar.
Veri alma işlemi end-of-file sinyali ile
son bulur. (Windows için Ctrl-Z)
*/
 
package org.javablog;
 
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Formatter;
import java.util.Scanner;
 
public class FileOutput
{
    private StringBuffer email;
    private String fileName;
    private Formatter output;
 
    FileOutput()
    {
        fileName = "mail.txt";
        output = null;
        email = null;
    }
    FileOutput(String fileName)
    {
        this.fileName = fileName;
        output = null;
        email = null;
    }
 
    public void openFile()
    {
        try
        {
            output = new Formatter(
                 new BufferedWriter(
                 new FileWriter(fileName, true)));
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
 
    public void addRecord()
    {
        Scanner in = new Scanner(System.in);
        email = new StringBuffer();
        System.out.println("Please enter an emaill adress");
        while(in.hasNext())
        {
            email.append(in.next());
            output.format("%s%n", email);
            email.delete(0, email.length());
        }
    }
 
    public void closeFile()
    {
        if(output != null)
        {
            output.close();
        }
    }
}

Şimdide dosyaya yazılan verileri okuyup ekrana yazan FileInput sınıfımızı geliştirelim.

/**
FileInput.java
mail.txt adlı dosyadaki verileri okuyarak
ekrana basar.
*/
package org.javablog;
 
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
 
public class FileInput
{
    private String fileName;
    private Scanner input;
    private StringBuffer email;
 
    FileInput()
    {
        fileName = "mail.txt";
        input = null;
        email = new StringBuffer();
    }
    FileInput(String inputFile)
    {
        fileName = inputFile;
        input = null;
        email = new StringBuffer();
    }
 
    public void openFile()
    {
        try
        {
            input = new Scanner(
                  new BufferedReader(
                  new FileReader(fileName)));
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
    }
 
    public void readFile()
    {
        while(input.hasNext())
        {
            email.append(input.nextLine());
            System.out.println(email);
            email.delete(0, email.length());
        }
 
    }
    public void closeFile()
    {
        if(input != null)
        {
            input.close();
        }
    }
}

Artık bu iki sınıfımızı uygulamaya koyan main methoduna sahip FileTest sınıfımızı aşağıdaki gibi tanımlayabiliriz.

package org.javablog;
 
public class FileTest
{
    public static void main(String[] args)
    {
        //Verileri dosyay yaz
        FileOutput out = new FileOutput();
        out.openFile();
        out.addRecord();
        out.closeFile();
 
        //Dosyadaki verileri oku
        FileInput in = new FileInput();
        in.openFile();
        in.readFile();
        in.closeFile();
    }
}

Görüldüğü gibi Java ile dosya işlemlerini ele almak oldukça basit. Scanner ve Formatter gibi sınıflara geçirilen herhangi bir veri kaynağı ile, uygulama içerisinde doğrudan çalışabiliyoruz. Veri kaynağının detaylarını bilmesek de, Scanner ve Formatter sınıflarının sunmuş olduğu methodları kullanarak, farklı veri kaynaklarına verilerimizi yazıp okuyabiliyoruz.


İlgili Yazılar:

  1. Swing JFileChooser ile Dosya Bilgilerini Almak
  2. Java ile Mail Gönderme – JavaMail API
  3. Java I/O Temelleri
  4. Java Object Serialization
  5. Javada Disassembler ve Decompiler İşlemleri

Yorum bırakmak için buraya, Sitenizden trackback vermek için buraya tıklayabilirsiniz.

3 Responses to “Java Scanner ve Formatter Sınıfları ile Dosya İşlemleri”

  1. sezer diyor ki:

    merhaba

    peki bu mail.txt dosyasını nerde oluşturuyo ve içine eklediğim mail adreslerini nasıl görüntüleyebilirim yani kontrol etmek amacıyla içine yazmışmı veya yazmamış mı?
    teşekkürler

  2. nuri diyor ki:

    mail dosyası proje dosyasının rootu içersinde oluşur. genelde belgelerimde netbeams project yada eclipse project klosörü içersinde olur uygulamanınızın klöröüne girdiğinizde göreceksiniz.

  3. semih diyor ki:

    Bir sorum olacak daha yeni yeni java öğrendiğimi düsünerek cevap verirsen sevinirim.
    Elimde bir dosya var sonuna kadar okumak istiyorum. Ancak arada boş satırlar var bu boş satırları almadan bu satırları nasıl başka bir dosyaya yazabilirim? Ya da başka bir değişle bir döngüde satırda yazı olup olmadığını nasıl ayırabilirim?

Leave a Reply