Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

readme.md

Reader & Writer

Reader

Karakter akışlarından gelen verileri okumak için yazılmış soyut bir sınıftır. Okuma işlemleri için gerekli bazı metotları tanımlamıştır. Bu metotlardan bazılarını inceleyelim:

void close() Akışı kapatır. Bütün akış kaynakları işlem tamamlandıktan sonra kapatılmalıdır!
int read() Akışta bulunan sıradaki karakteri okur. Eğer dosyanın sonuna gelindiyse -1 döndürür.
int read(char[ ] buffer) Parametre olarak verilen dizinin boyutu kadar karakteri okur ve dizinin içine atar. Bu dizinin türünün InputStream sınıfındakinden farklı olarak char olduğuna dikkatinizi çekerim.
boolean ready() Akışın okunmaya hazır olup olmadığını denetler.
long skip(int n) Parametre olarak verilen sayı kadar karakteri okumadan atlar.

Writer

Karakter akışlarına veri yazmak için kullanılan soyut bir sınıftır. Yazma işlemleri için gerekli bazı metotları tanımlamıştır. Bu metotlardan bazılarını inceleyelim:

void close() Akışı kapatır. Bütün akış kaynakları işlem tamamlandıktan sonra kapatılmalıdır!
void flush() Eğer fiziksel olarak akışa yazılmamış karakterler varsa, bunların yazılması için bir sinyal gönderir.
void write(int c) Akışa bir karakter yazar. Bu değeri parametre olarak alır.
void write(char[ ] buffer) Parametre olarak aldığı karakter dizisinin içindeki bütün karakterleri sırasıyla akışa yazar. Bu dizinin türünün OutputStream sınıfındakinden farklı olarak char olduğuna dikkatinizi çekerim.
void write(String s) Parametre olarak aldığı metni akışa yazar.
Writer append(char c) Parametre olarak aldığı karakteri akışın sonuna ekler, daha sonra kendini döndürür. Zincirleme metotlar yazabilmek amacıyla eklenmiştir.

FileReader

Metin dosyalarının içeriğini okumak için bu sınıfı kullanırız. Sınıfın bir örneğini alırken parametre olarak okuyacağımız dosyanın yolunu String veya File olarak veririz. Eğer okumak istediğimiz dosya mevcut değilse FileNotFoundException fırlatılır.

Şimdi FileInputStream başlığında yaptığımız örneği FileReader kullanarak tekrar yapalım:

File inputFile = new File("ornek_dosya.txt");

try
{
	FileReader fileReader = new FileReader(inputFile);
	
    int c;
	while ((c = fileReader.read()) != -1)
	{
		System.out.print((char) c);
	}
	
    fileReader.close();
}
catch (IOException ex)
{
	System.out.println("Dosyayı okurken hata meydana geldi!");
}

Bu örnekte FileInputStream yerine FileReader kullandık. Ayrıca read() metoduyla okuduğumuz int türündeki karakteri char türüne dönüştürdüğümüze dikkat edin.

FileWriter

Metin dosyalarının içeriğine yazmak için bu sınıfı kullanırız. Sınıfın bir örneğini alırken parametre olarak okuyacağımız dosyanın yolunu String veya File olarak veririz. Ayrıca ikinci parametre olarak boolean türünde append isminde bir argüman veririz. Bu argüman dosyaya ekleme yapılıp yapılmayacağını tespit etmek için kullanılır. Eğer true verirsek ve yazmak istediğimiz dosya mevcutsa; dosyanın içeriği korunur ve sonuna ekleme yapılır. Eğer false verirsek ve yazmak istediğimiz dosya mevcutsa; dosyanın mevcut içeriği silinir ve üzerine yazılır. Eğer biz bu parametreyi vermezsek varsayılan değer olarak false kullanılır.

CharArrayReader ve CharArrayWriter sınıfları

Bir karakter dizisini tıpkı bir akış gibi okumak için CharArrayReader sınıfını kullanırız.

Bir karakter dizisine tıpkı bir akış gibi yazmak için ise CharArrayWriter sınıfını kullanırız.

InputStreamReader

InputStream türündeki bir akış kaynağını Reader türüne dönüştürmek için bu sınıf kullanılır. Eğer parametre olarak aldığınız InputStream türündeki bir akış kaynağının karakter akışı olduğunu biliyor ve Reader sınıfının işlevselliğinden faydalanmak istiyorsanız bu sınıfı kullanmalısınız:

try
{
	InputStream inputStream = new FileInputStream("ornek_dosya.txt");
	Reader reader = new InputStreamReader(inputStream);
}
catch (IOException ex)
{
	System.out.println("Bir hata meydana geldi!");
}

OutputStreamWriter

OutputStream türündeki bir akış kaynağını Writer türüne dönüştürmek için bu sınıf kullanılır. Eğer parametre olarak aldığınız OutputStream türündeki bir akış kaynağının karakter akışı olduğunu biliyor ve Writer sınıfının işlevselliğinden faydalanmak istiyorsanız bu sınıfı kullanmalısınız:

try
{
	OutputStream outputStream = new FileOutputStream("ornek_dosya.txt");
	Writer writer = new OutputStreamWriter(outputStream);
}
catch (IOException ex)
{
	System.out.println("Bir hata meydana geldi!");
}

BufferedReader ve BufferedWriter sınıfları

BufferedInputStream ve BufferedOutputStream sınıflarının karakter akışları için kullanılan karşılıklarıdır.

Dosyaya yazma ve okuma işlemleri zaman açısından maliyetlidir.

Neden Maliyetelidir;

  • Uygulamanın daha yavaş bir donanımla muhatap oluyor olması,
  • Her I/O işleminde byte dönüştürme işlemi yapıyor olması.
  • Dosya üzerinde yapılacak her işlemin bir sonraki işlemi beklemek zorunda olması

Bunu yavaşlığa çözem olarak Bellekte tampon bölge oluşturup I/O işlemlerinin orada yönetilmesinde bulunmuş. Buffer sayesinde bir dosyadan okuma yaparken aynı anda veri yollayabilirsiniz.

BufferedReader

BufferedReader ile dosyayı read() metodu ile karakter karakter okuyabiliriz:

try
{
  String fileName = "ornek_dosya.txt"; 
  FileReader reader = new FileReader(fileName);
  BufferedReader bufferedReader = new BufferedReader(reader);
  int c;
  while ((c = bufferedReader.read()) != -1) {
    System.out.println("Char: " + (char) c);
  }
  bufferedReader.close();   
}
catch (IOException ex)
{
	System.out.println("Bir hata meydana geldi!");
}

BufferedReader InputStreamReader'a kıyasla epey hızlı çalışır. Bunu buffer kullanarak başarır.

BufferedReaderın bir başka avantajı , metin dosyasını yalnızca karakter karakter değil, satır satır da okumanıza ve işlemenize olanak tanıyan ek bir yöntem olarak readLine() metodunu sunmasıdır:

try  
{
  String fileName = "ornek_dosya.txt";  
  FileReader reader = new FileReader(fileName);
  BufferedReader bufferedReader = new BufferedReader(reader);  
  String line;
  while ((line = bufferedReader.readLine()) != null) {
    System.out.println("Line: " + line);
  }
  bufferedReader.close();  
}
catch (IOException ex)
{
	System.out.println("Bir hata meydana geldi!");
}

Java'da dosya okumak için kullanılan yöntemlerinin, okuma süresi üzerinde nasıl etkili olduğunu görmek için 100 milyon baytlık bir dosya kullanılarak süreleri karşılaştırılmış.

Reading-files-in-Java-performance-comparison

Buffer kullanmayan ve Buffer kullanan yöntemler arasındaki büyük fark, **Buffer kullanan **yöntemlerin yukarıdaki şemada kendi aralarındaki farkın görünmesini zorlaştırıyor. Bu nedenle, aşağıda Buffer kullanan yöntemleri gösteren ikinci bir diyagramla yakından bakalım:

Reading-files-in-Java-performance-comparison-buffered

Biraz karışık gelmiş olabilir, buraya kadar bir çok sınıf ve metod kullandık. Bu sınıfların ilişkilerini görsel olarak görmek size biraz yardımcı olacaktır.

Düz çizgiler, binary verilerin akışını temsil eder; kesikli çizgiler, metin verilerinin, yani karakterlerin akışını gösterir.

BufferedWriter

BufferedWriter 'a bir FileWriter verdikten sonra artık yapmamız gereken sadece dosyaya yazmak istediğimiz veriyi write metoduna vermek.

try 
{
    String fileName = "ornek_dosya.txt";
	FileWriter writer = new FileWriter(fileName);
    BufferedWriter bufferedWriter = new BufferedWriter(writer);
    String kodluyoruz="Öğrenmek için kodluyoruz";
    bufferedWriter.write(kodluyoruz);
    bufferedWriter.close();
}
catch (IOException ex)
{
	System.out.println("Bir hata meydana geldi!");
}

Java'da dosyaya veri yazmak için kullanılan yöntemlerinin, yazma süresi üzerinde nasıl etkili olduğunu görmek için 100 milyon baytlık bir dosya kullanılarak süreleri karşılaştırılmış:

Writing-files-in-Java-performance-comparison-v2

Buffer kullanmayan ve Buffer kullanan yöntemler arasındaki büyük fark okumada olduğu gibi burda da açıkça görünüyor. Buffer kullanan yöntemlerin kendi aralarındaki farkı da aşağıdaki görselde görebiliyoruz:

Writing-files-in-Java-performance-comparison-buffered

Okuma yapmak için kullanılan sınıfların kendi aralarındaki ilişkiyi görmek işinizi kolaylaştıracaktır:

Java-FileOutputStream-FileWriter-OutputStreamWriter-BufferedOutputStream-BufferedWriter-en

İlk üç görselin kaynağı

son üç görselin görselin kaynağı