Java Veri Akışları
Java – Input/Output Streams Kullanmı
Bu yazımda Java Input/Output işlemlerini temel olarak ele alacağım;
Java da tüm input/output işlemleri stream üzerinden yapılır . Stream ; sıralı olarak işlemler yapılan veri dizisidir.Stream çok farklı veri kaynaklarından veri alışverişi yapabilir ; disk , veritabanı , console…
Alttaki şekilde programım farklı kaynaklardan aldığı veri dizisine örnek verilmiştir.
Stream ler çok farklı veri tiplerini destekler ; object , primitive veri tipleri , karakterler,byte veri tipleri
Input Stream
Java programı dış kaynaktan(veri tabanı , disk) veri okurken input stream kullanır
Output Stream
Java programından dış kaynağa (veri tabanı , disk) veri gönderilirken kullanılır
Steream sınıflarının diagramları
Byte Streams
Byte stream ler 1 byte(8) bit işlemler yapmak için kullanılır . I/O işlemleri yapan tüm sınıflar InputStream veOutputStream sınıflarından inherit edilmiştir.
Şimdi I/O byte stream işlemlerinde en sık kullanılan iki sınıfla ilgili örnek yapalım :
FileInputStream fileInputStream = null; // dis kaynaktan(disk,..) veri okur
FileOutputStream fileOutputStream = null; // dis kaynaga(disk,..) veri yazar
try {
fileInputStream = new FileInputStream;
fileOutputStream = new FileOutputStream;
byte b;
while((b = (byte)fileInputStream.read()) != -1){
fileOutputStream.write(b);
}
} catch (Exception e) {
throw new Exception(“Hata meydana geldi”);
}finally{
fileInputStream.close();
fileOutputStream.close();
}
Yukarıdaki örnekte görüldüğü üzere dosyadan veriler byte byte okunarak başka bir dosyaya yazdırılmıştır
Burada dikkat etmemiz gerek noktalar
- Belirttiğimiz dosyanın bulunamama durumunu göze alarak throw edilebilecek exception ları dikkate almamız gerekir
- read metodu ile 1 byte veri okunur
- write metodu ile 1 byte veri dış kaynağa yazdırılır
- Dosyada okunacak veri kalmadığı zaman -1 döner
- Dosya ile işimiz bittiği zaman dosyayı kapatmamız gerekmektedir . Böylece gereksiz yere kaynak kullanılmasını engelleriz
Java da karakterler üzerinde işlem yaparken Unicode esas alınır . Bir üst başlıkta byte stream için byte byte okuma ve yazma yapıldığını belirtmiştik . Karakterler ise unicode formatında yani 2 byte yer kaplar . Karakter formatıyla yazılmış bir file üzerinde read veya write işlemi yapmak istediğimizde Character Streams kullanılır .
Character stream işlemleri yapmak için Reader ve Writer sınıflarını extend eden FileReader ve FileWriter sınıflarını kullanabiliriz .
FileReader ; dış kaynaktan(disk,file..) programa veri okur (input stream)
FileWriter : programdan dış kaynağa veri yazar (output stream)
Alttaki örneği inceleyelim;public static void main(String[] args) throws IOException{
FileReader inputStream = null;
FileWriter outputStrem = null;
try {
inputStream = new FileReader;
outputStrem = new FileWriter;
int character;
while((character = inputStream.read()) != -1){
outputStrem.write(character);
}
}catch (Exception e) {
System.out.println(e.getMessage());
}finally{
inputStream.close();
outputStrem.close();
}
}
Buffered Streams
Dosya işlemleri yaparken satır satır okuma veya yazma işlemlerini buffered streams ile yapabiliriz .
Read ve write işlemlerinde yeni bir satır görene kadar read veya write işlemi yapar .
Yeni bir satıra geçeceğini şu karakterlerden anlar
- (“\r\n”)
- (“\r”)
- (“\n”).
PrintWriter ile dış kaynağa veri gönderebiliriz (file , disk) (output stream)
Alttaki örneği inceleyelim . Bu örnekte dosyadan veriler satır satır okunmaktadır
BufferedReader inputStream = null;
PrintWriter bufferedWriter = null;
try{
inputStream = new BufferedReader(new FileReader;
bufferedWriter = new PrintWriter(new FileWriter;
String line = null;
while((line = inputStream.readLine()) != null){
bufferedWriter.println(line);
}
}catch(FileNotFoundException e){
}catch (IOException e) {// TODO: handle exception
}finally{
inputStream.close();
bufferedWriter.close();
}
java.io paketleri ile character stream leri ile byte stream leri arasında dönüşüm yapılabilir .
- Unicode olmayan bir veri tipi InputStreamReader sınıfı ile unicode veri tipine dönüştürülür
- Unicode tipindeki bir veri ise OutputStreamWriter ile unicode olmayan veri tipine dönüştürülür
Alttaki resimde de dönüşüm verilmektedir .
Alttaki örneği inceleyelim . Non-Unicode veri tipi bulunan bir dosyadan okunan karakterler unicode değerleriyle yazılır . Bunu yapmak için InputStreamReader kullanmalıyız
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream;
int character;
while( (character = inputStreamReader.read()) != -1 ){
System.out.println((char)character);
}
Şimdi ise unicode verileri non-unicode veri tipine çevirelim
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream;
outputStreamWriter.write(“Hello”);
File Objesi
File objesi bir dosyanın çeşitli özelliklerini saklar . File objesi kesinlikle göstermiş olduğu file içerisindeki verileri saklamaz
- getName() : Dosyanın adını verir
- getPath() : Dosyanın yolunu belirtir
- getAbsolutePath() : Dosyanın gerçek uzantısını belirtir (c:\User\…)
Örnek :
Kisi k = new Kisi(“Serkan”,”Sakinmaz”);
ObjectOutputStream objectOutputStream = new ObjectOutputStream (new FileOutputStream;
objectOutputStream.writeObject(k);
Kaynakların kapatılması (Closing streams)
Bir kaynak üzerinde işlemlerimizi bitirdikten sonra close() metodu ile kullandığımız kaynağı kapatmamız gerekmektedir
Java 7 de ise AutoClosable interface ini implemente eden sınıflar try bloğundan sonra kullandığı kaynağı kapatır.