Örnek Dosya Kopyalama Uygulaması

Bilgisayarımızın masaüstünde bulunan bir dosyayı önce byte byte sonra da karakter karakter okuyarak kopyalayalım.

[codesyntax lang=”java” lines=”no”]

package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteByteKopyala {
	public static void main(String[] args) throws IOException {
		FileInputStream in = null;
		FileOutputStream out = null;
		try {
			in = new FileInputStream("C:UsersErkinDesktopdeneme.txt");
			out = new FileOutputStream("C:UsersErkinDesktopbyteKopyala.txt");
			int c;
			while ((c = in.read()) != -1) {
				out.write(c);
			}
			System.out.println("Dosya kopyalandı");
		} finally {
			if (in != null) {
				in.close();
			}
			if (out != null) {
				out.close();
			}
		}
	}
}

[/codesyntax]

Byte okuma yazma işlemlerinde kullanılan FileInputStream ve FileOutputStream sınıfları yeterli oldu.

Şimdi de karakter karakter kopyalama yaparken karakterleri satır satır okuyalım. Bunun için  FileReader ve FileWriter sınıfları yeterli olmuyor. Stream chaining özelliği ile BufferedReader ve BufferedWriter (ya da PrintWriter) sınıflarını kullanıyoruz.

[codesyntax lang=”php” lines=”no”]

package io;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class SatirKopyala {
	public static void main(String[] args) throws IOException {
		BufferedReader inputStream = null;
		PrintWriter outputStream = null;

		try {
			FileReader reader = new FileReader("C:UsersErkinDesktopdeneme.txt");
			inputStream = new BufferedReader(reader);
			outputStream = new PrintWriter(new FileWriter("C:UsersErkinDesktopsatirKopyala.txt"));

			String l;
			while ((l = inputStream.readLine()) != null) {
				outputStream.println(l);
			}
			System.out.println("Kopyalandı");
		} finally {
			if (inputStream != null) {
				inputStream.close();
			}
			if (outputStream != null) {
				outputStream.close();
			}
		}
	}
}

[/codesyntax]

BufferedWriter ve PrintWriter sınıfları arasındaki en büyük fark PrintWriter nesnesinin neredeyse bütün tipleri parametre olarak alan print() ve println() fonksiyonlarının olması. BufferedWriter sınıfındaki write() metodu da aynı işi yapmasına rağmen parametre olarak tek karakter ya da String alır.

BufferedReader sınıfının bize burda getirdiği avantaj readline() metodudur. Bu sayede satır satır okuma yazma yapabiliriz.

Stream Sınıfları

Streamler iki tipte veriyi desteklerler.

  • Basit bitler,
  • Karakterler

bazı streamler basit bir şekilde giriş çıkış yaparken bazıları işletilerek kullanışlı yollarla veriyi dönüştürür.

Kendi içlerinde nasıl çalıştıkları çok önemli değil. Hepsi programların onları kullanabilmeleri için aynı basit modeldedir.

Veri Kaynağından programa (veri kaynağı içinden bilgi okumak) ve programdan veri kaynağına (hedefe bilgi yazmak) nesneler byte dizileri haline getirilir. Aslında serialization dediğimiz şey de nesnelerin byte dizileri haline dönüşme işlemidir.

Streamler kullanıldıktan sonra mutlaka kapatılmalıdırlar.

Veri kaynaklarına (data source) ve sink denilen programlara input streamler ve output streamler de denir. Bir input streamden okuma işlemi yapabiliriz ama yazma işlemi yapamayız. Aynı şekilde bir output streame yazma yapabiliriz ancak okuma yapamayız.

Her tip için okuma ve yazma işlemlerini gerçekleştirecek reader ve writer classları yazılmıştır.

Karakter input streamler READER sınıfın alt sınıfları tarafından implement edilir, karakter output streamler ise WRITER sınıfının alt sınıfları tarafından implement edilir.

Byte input streamler INPUTSTREAM sınıfının alt sınıfları tarafından implement edilirken byte output streamler OUTPUTSTREAM sınıfının alt sınıfları tarafından implement edilir.

InputStream Sınıfındaki Bazı Methodlar :

int read() : byte byte okuma yapar, okunacak karakter kalmayınca -1 döner.

int read(byte[] buffer) : byte byte okuma yaparken byte bloku (dizisi kullanır) okunan byte sayısını döner.

int read(byte[] buffer, int offset, int length) : ekstra olarak okuma aralığı verilir.

Etkinliği arttırmak için her zaman optimum aralık blok belirlenmelidir ya da buffered streamler kullanılmalıdır.

void close() : streamlerin kapatılmasını sağlayan metot.

int available() : okunabilir olan byte sayısını o an için döndüren method.

long skip(long n) : parametre verilen değer kadar bit atlanır, okunmaz.

OutputStream Sınıfındaki Bazı Methodlar :

void write(int) : byte byte yazma yapar.

void write(byte[] buffer) : byte byte yazma yaparken byte bloku (dizisi kullanır) yazılan byte sayısını döner.

void write(byte[] buffer, int offset, int length) : yazma aralığı verilerek şu byte’lar arasına bu kadarlık byte yaz denilir.

void close(): stream’in kapatılmasını sağlar.

void flush() : Bazen yazma işleminden önce streamler bitleri biriktirir. Bu metod yazmaya zorlar.

Bir programda tek bir stream objesi çok nadiren kullanılır. Bunun yerine streamler iç içe geçirilerek performans arttırılır. Buna “stream chaining” deniyor.

input chain örneği;

BufferedReader inputStream = new BufferedReader(new FileReader("C:UsersErkinDesktopdeneme.txt"));

ya da tersi output stream örneği ;

PrintWriter outputStream = new PrintWriter(new FileWriter(new File("C:UsersErkinDesktopdeneme.txt")));

Son olarak  transient ve static değişkenler serialize edilmezler.