Skip to main content

Java’da XML işlemleri

Merhabalar.

Ara ara Java ile ilgili yazılar yazmaya devam ediyorum. Bu blog yazısının konusu Java ile XML İşlemleri. Java ile XML işlemleri yapabilmek için birden çok sınıf mevcut. Fakat ben bu yazıda bu işlemleri yapmak için Document Builder isimli sınıfı kullanacağım.

Eğer XML ve XML dosyaları ile ilgili yeterli bilgiye sahip değilseniz, bu yazıyı okumadan  önce  Java’dan bağımsız olarak XML ile ilgili olarak  bir araştırma yapmanız yararınıza olacaktır.

Öncelikle Java’da XML dosyasından okuma yapabilmek için bir adet XML dosyası oluşturulması gerekiyor. Ben XML dosyasında Sanatçı isimleri ve onların şarkılarını tutmayı düşündüm. Yani XML dosyasını bir veri tabanı olarak düşünecek olursak, bu dosya Sanatçıları ve onlara ait şarkıları tutuyor.

Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Java’da Dosya Kopyalama işlemleri ve performans

javaTekrardan merhaba. Kısa bir süre önce Yeniden Bloglamaya Başlamak diye bir yazı kaleme almış ve uzun süren sessizliği bozmuştum. Madem öyle, kaldığımız yerden devam edelim.

Bu yazıda Java’da dosya kopyalama yöntemleri üzerine değineceğim. Java’da dosya kopyalamak için kullanılan yöntem tek değil. Birden fazla yöntemle bu işi halledebilirsiniz. Ben bu yazıda bu yöntemlerden en çok bilinen yöntem olan File Stream ve Java 7 ile birlikte gelen Java NIO kütüphanesinde bulunan File Channel yöntemlerini irdeleyeceğim.

Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Java’da Dosya Kopyalama İşlemleri

Java’da dosya okuma , yazma , kopyalama işlemleri için bir çok farklı sınıf kullanılır. Ve bu sınıflar performansları açısından farklılık göstermektedir. Özellikle Java’nın ilk zamanlarında oluşturulan sınıflar ile ,  Java  7 ‘de kullanılan sınıflar arasında performans açısından gözle görülebilir farklılıklar bulunmaktadır.

Java’da dosya kopyalaması yaparken kullanılabilecek farklı yaklaşımlar bulunmaktadır.

  1. Byte Byte okuyup yazma
  2. Bir bütün olarak okuyup yazma
  3. Tampanlama kullanarak okuyup yazma.

Bu 3 yaklaşımdan en  performanssız olanı şüphesiz ki Byte byte okuyup yazmaktır. Sebebi her okunan byte sonrasında sistemin birde yazma işlemi yapması gerekmektedir.  Bunun için önce hardiske erişip okuma işlemi yapması , daha sonra okuduğu veriyi yine hardiske erişerek yazması gerekmektedir. Hardisklerin  oldukça yavaş aygıtlar olduğu düşünülürse harcanacak zamanı az çok tahmin edebiliriz. Bu nedenle bu yöntem önerilmeyen bir yöntemdir.  Çok küçük boyutta dosya okuma işlemleri yapılacaksa , ve performans çok önemli değilse kullanılabilir.

İkinci yakşım ise dosyayı bir bütün olarak okumak , ve tek  seferde yazmaktır. Bu  yaklaşım aslında düşünüldüğünde en mantıklı gelen yaklalım olabilir. Bir düşünelim dosyayı okuyacağız, ve tek bir sefer hardiske ulaşarak o dosyayı yazacağız. Kulağa ne kadar hoş geliyor  öyle değil mi ?    Ama aynı zamanda çokta tehlikeli. Çok büyük boyutlu bir dosya ile çalıştığımızı hesap edelim , ve bu dosya boyutu bilgisayardaki Ram miktrınıda aşıyor bulunsun ? Bu durumda  okuma işlemi yaparken  RAM tamamen dolacak ve bilgisayar kaynaksızlıktan kağnı gibi  işlem yapar hale gelecektir.  Bu nedenle bu yaklaşımda pek tercih edilmemektedir.

En iyi  kopyalama yaklaşımını en sona sakladım 🙂 Bu yontemde bir tampon boyutu belirlenir  ve bu tampon boyutu büyüklüğünde bir byte dizisi oluşturulur.  Byte dizisi oluşturmamızın sebebi dosyadan byte olarak okuma işlemi yapacak olmamızdandır. Java’da byte olarak okuma ve yazma işlemi yapmamızı sağlayan sınıflar  InputStream, ve OutputStream sınıflarıdır. Biz bu iki sınıftan türeyen FileInputStream ve FileOutputStream sınıfını kullanacağız.  Oluşuracağız sınıfta bir kaynak dosya, ve bir hedef dosya ismi vereceğiz.  Program çalışmaya başladığında  kaynak dosyanın var olup olmadığını kontrol edecek, eğer bir hata olması durumunda İstisna (Exception) fırlatacaktır.

Oluşturulan tampon  boyutu keyfidir, Statik olarak tanımlamak yerine  sisteme özel bir tasarım yapılabilir. Bir takım komutlar ile sistem belleğinin boyutu alınabilir ve belli bir yüzdelik dilim  bu tampon için ayırabilir. Ben 2000 byte’lik bir alan ayırmayı uygun gördük.  Peki ne  bu 2000 byte ne anlama gelecek.

Diyelim ki biz 6000 Byte boyutunda bir dosya kopyalamaya çalışalım  aşağıdaki sınıfta while dongusu içinde okuma islemi yapılmaya başlanacak  ve  bun tampon dolduğunda  FileOutputStream’ın Write metodu calişacaktır. 6000 Byte’lık bir kopyalama söz konusu olduğundan hardiske  sadece 3 defa yazma işlemi yapılacak ve  performansta artış sağlanmış olacaktır. Eğer ilk yaklaşım kullanılsa idi bu islem için 6000 bin defa okuma , 6000  defa yazma işlemi yapılacak ve performans kaybı söz konusu olacaktır.

Şimdi kodları paylaşalım.


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

public class dosyaKopyala {
	private static final int TAMPONBOYUTU = 2000;
	// Verilerimizi byte byte yazmak  performans kaybı olacaktır. Bu nedenle  byteların
	// bir arada bulundugu bir ön bellekleme yöntemi ile verileri  okumak  ve yazmak
	// cok daha performanslı olur.
	private static  byte onBellek[] = new byte [TAMPONBOYUTU];
	// 2000 boyutlu bir byte dizisi olusturuyoruz. Byte dizisi olusturmamızın sebebi byte byte okuma
	// yapacak olmamamız.  Input Stream , OutputStream sınıfları byte byte okuma yapar.

	public static void dosyaYedekle(String kaynak, String hedef) throws IOException
	{

	 try{

		 InputStream  okuyucu = null;
		 OutputStream yazici = null;
		 // Dosya  islemlerinde kullanılabilecek bir cok sınıf vardır. fakat dosya kopyalaması
		 // yaparken özellikle de byte byte okurken Onbellek yeteneği olan sınıfları kullanırız. Bu tip
		 // sınıflar "Stream" olarak son ek alırlar. ve InputStream , OutputStream sınıflarından türerler.
		 okuyucu =  new FileInputStream(kaynak);
		 yazici =  new FileOutputStream(hedef);
		 // kaynak ve hedef dosya gosterildi.
		  while(true)
		   {
			 // sonsuz bir dongu  kurulması saglanarak dosya kopyalamaya baslayacağız.
			  // ve dosya sonua geldiğinde döngüyü kırıp çıkacağız

			  int okunan = okuyucu.read(onBellek);
			   // okuma islemini byte byte yapmak yerine ön bellek sistemi kullaniyoruz
			  // okuyu.read() yaptıgımızda bu yordam her okudugu veriyi direk yazmak gerine 2000 li
			  // bloklar halinde yazma islemi yapılacak.
			  if(okunan==-1){
				break;
				// dikkt edilirse okuyucu.read() bir integer dondurur ve bu integer deger aslında bizim
				// okudumuz dosyanın byte olarak karsılıklarıdır.
				// eğer okudumuz değer -1 ise , dosyanın sonu gelmiş demektir.döngüyü kırmamız gerekir
			    }

			   yazici.write(onBellek);
			   // 20000 li blok  dosyaya yazıldı.
		 }

	   okuyucu.close(); // okuyucu kapat
	   yazici.close();  // yazıyı kapat.

	 }catch (IOException e){

		throw new IOException();
	 }

	}

	// Bu yordamdan kaynak dosya adı , ve hedef dosya adı elle girilir
	// Dikkat kaynak  dosya ile program aynı dizinde olmalıdır.

	public static void main(String[] args) {

		try{

		  dosyaYedekle("jandarma.Jpeg", "jandarmaKopya.Jpeg");
		} catch(IOException e){

			System.out.println("Dosya kopyalanırken hata olustu."+ e.getLocalizedMessage());

		}
		System.out.println("Dosya Kopyalam başarılı..");

	}

}

Kaynak Kodları indirmek için aşağıdaki tıklayın.. Sağlıcakla

https://www.dropbox.com/s/44u2yk3hs652yop/Dosya%C4%B0slemleri.rar

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Asp.Net Kişisel Blog Projesi Kaynak Kodları

Merhabalar ;

Projelerle dolu yorucu bir  eğitim öğretim yılının ardından  sınav döneminin de neredeyse sonuna geldiğimize göre sanırım bloguma daha fazla vakit ayırabilirim.

2012-2013 Bahar döneminde  Web Programlama adıyla  İstanbul Ünivesitesi Bilgisayar Mühendisliği bölümünden aldığımız derste  değerli hocamız Yrd. Doçent Doktor Selçuk Sevgen tarafından  Asp.Net projesi yapmamız istendi.   İlerde bir takım halinde çalışacağımız da düşünülerek bir takım oluşturmamız ve projeyi birlikte yapmamız istendi.

Proje olarak  Asp.net alt yapısını kullanarak basit bir Kişisel Blog sitesi yapmayı seçtik. Grup 3 kişiden oluştu  Ömer Özdemir , İlyas Yılmaz ve bendenizden oluştu.

Bu kişisel Web Sitesi kodlanırken temel özellikler baz alındı. Teknoloji olarak Asp.Net   ve Microsoft Acces  veri tabanı alt yapısı kullanıldı. Aşağıdaki bir takım özelliklere  sahip .

  • Admin Girişi
  • User Girişi
  • Konu Ekleme , Silme , Güncelleme
  • Kategori Ekleme, Silme
  • Kullanıcı girişi yaparak konu altına yorum yazma .
  • Admin girişiyle yorumları düzenleme , silme , güncelleme
  • Yeni Üye Kaydı

gibi temel işlemlere cevap verebilmektedir.

Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Java’da Rastgele Karakterler Üretmek

Merhabalar . Derslerin yoğunluğundan ötürü uzunca bir süredir  blog yazamadığımın farkına vardır ve gecenin bu saatinde bir şey paylaşma isteği doğdu. 🙂

Java’da basit bir sınıf  yazdım ve bunu paylaşmak istedim.  Bu sınıf ne işe yarar ? Hepimiz mutlaka bir yerlerde rastgelmişizdir rastgele  parola  üreten sitelere yada programlara.  İşte bu sınıf tam olarak bu işlemi yapıyor.    Bu Java sınıfı rastgele karakter üretmek üzere yazıldı.  Kullanıcı   istediği  aralıkta rastgele karakter üretebiliyor.  Bir değişken vasıtasıyla  istediğimiz uzunlukta  stringlerde oluşturabiliriz böylelikle.

Şimdi sınıfın kodlarını paylasayim. Gerekli acıklamaları kodların arasına yazdım.  Umarım bir yerlerde işinize yarar 🙂

 

karakterUretme sınıfı :


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package karakteruret;

/**
 *
 * @author Aytac Cici
 */
public class KarakterUret {

    /**
     * Aytaç Cici http://www.aytaccici.com
     * 
     */
    public  char karakterUret(char karakter1 , char karakter2){
       // Parametre  olarak gobderilen iki karakter arasında  karaktr üretilecek
        // orneggin a - e girdik diyelim program a,b,c,d,e karakterlerini üretecektir
        
        
        return (char)(karakter1+Math.random()*(karakter2-karakter1+1));
       
    }
    
     public  char karakterUret(){
       
       // Herhangi bir karakter üretir.  Overload yaptık 
         // asci kodlarla hareket ediyoruz 0-255 arası bir kod üretebilir 
        
        return karakterUret('\u0000','\uFFFF');
       
    }
    
   public  char kucukKarakterUret(char karakter1 , char karakter2){
       
       return karakterUret('a', 'z');
   }
   
    public  char buyukKarakterUret(char karakter1 , char karakter2){
       
       return karakterUret('A', 'Z');
   } 
    
     public  char rakamUret(char karakter1 , char karakter2){
       
       return karakterUret('0', '9');
   } 
}


Bu sınıfı kullandığımız ana program ise aşağıdaki gibidir. String Builder nesnesi kullanarak üretilen tek karakteri birleştirerek çok karakterden oluşan şeyler ürettik.



/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package karakteruret;

/**
 *
 * @author Aytac Cici
 */
public class testKarakterUret {
   
    public static void main(String args []){
        
       KarakterUret karakterUretici = new KarakterUret();
       int kacKarakter = 10; // Karakter uzunlugunu bu degisken ile berlileyeceğiz
       StringBuilder sadeceKarakterler =  new StringBuilder("");
       StringBuilder sadeceRakamlar =  new StringBuilder("");
       StringBuilder butunKarakterler =  new StringBuilder("");
       char uretilenKarakter; 
       char uretilenRakam;
       char karakterRakam;
        for (int i = 0; i < kacKarakter; i++) {
              // sadece A - Z arası karakterler üretir
              uretilenKarakter=karakterUretici.buyukKarakterUret('A', 'Z');
              uretilenRakam=karakterUretici.rakamUret('0', '9');
              karakterRakam=karakterUretici.karakterUret();
            sadeceKarakterler.append(uretilenKarakter);
            sadeceRakamlar.append(uretilenRakam);
            butunKarakterler.append(karakterRakam);
        }
       
       
       System.out.println(sadeceKarakterler);
       System.out.println(sadeceRakamlar);
        System.out.println(butunKarakterler);
    }
    
    
}

Umarım bir yerlerde yararı olur. Görüşmek dileğiyle 🙂

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Java Dilinde Stringler ve Performans

javaHerkese merhabalar. Uzun sayılabilecek bir aradan sonra tekrardan blogda yazacak fırsat bulmanın sevincini yaşıyorum. Zorlu bir sınav dönemini atlattıktan sonra yavaş yavaş bir şeyler paylaşmaya devam edebiliriz. Bu yazımda sizlerde String tipinden bahsedeceğim. Java String tipi diğer dillere oranla farklılıklar gösterir. Bunu örneklerle anlaşılır bir biçimde irdelemeye çalışacağız.

Bu konuda bilmemiz gereken ilk şey Java Dilinde String tipinin aslında bir sınıf tanımlaması olduğudur. Ve birden farklı biçimde oluşturulabilirler.


public class StringDeneme {

	public static void main(String[] args) {
		  String s1 = new String("Bu ilk oluşturma biçimim..");
		  String s2 = "Buda ikinci string oluşturma biçimim";
		  System.out.println(s1);
		  System.out.println(s2);

	}

}

Görüldüğü gibi Stringler birden farklı bir biçimde elde edilebiliyor. Stringler Java dilinde diğer tiplere göre farklı davranırlar demiştik. Bunu hemen bir kodla açıklayalim ve performans açısından bu durumu irdeleyelim.


public class StringDeneme {

	public static void main(String[] args) {
		  String s1 = new String("Aytaç");
		  String s2 = new String(" Cici");
		  String s3 = s1+s2;
		 System.out.println(s3);

	}

}

Yukarida ki kodu göz önüne alacak olursa iki adet String tanımlanmıi ve bu iki string  + operatörüyle birleştirilmiştir. İşte bu işlem Java’da dikkat edilmesi gereken işlemlerden bir tanesidir. Peki neden ? Çünkü Java bu birleştirme işlemini bizlerin tahmin ettiği bir biçimde yapmaz. Eğer biz bu işlemi yapıyor olsaydık , muhtemelen s1 isimli stringin sonuna s2 isimli stringi direk ekleyecek ve bu işlemi çabucak halletmiş olacaktık.Fakat Java bu konuda böyle davranmaz.  Çünkü daha önce dile getirdiğim gibi Stringler aynı bir yere sahiptir ve  şu özellikleri gösterirler.

Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

C İle Veri Yapıları : Kuyruk Ve Kuyruk İşlemleri

Bundan önceki yazımda temel veri yapılarından biri olan Yığın (Stack) kavramına göz atmıştık.  Stack   tek yönlü bir veri yapısıydı,  bir  yığına ilk giren eleman  , yığından en son çıkan eleman oluyordu. Kuyruk   ise yine temel veri yapılarından bir tanesidir.  Aslında günlük hayatta belkide farkında olmadan kullandığımız bir yapı.  Örneğin bir hastahanede muayne olmak isteyen hastaların sırasını göze alalım.  Bu sıraya dahil olmak isteyen hastalar  en sondan  kuyruğa dahil olmak zorundadır. Aynı şekilde   doktor muayne olacak hastayı en önden   çağırmaktadır.   Kısaca diyebiliriz ki , bir kuyruğuna eleman eklerken sondan , eleman çıkartırken önden  işlem yapacağız.

Bu durumda böyle bir yapı tanımlarken   kuyruğun önü ve arkasını gösteren  iki adresimiz olacağını çıkartabiliriz.
Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

C Programlama : Yiğin İşlemleri

C Programlama ile Veri Yapıları diğer dillere oranla biraz daha emek istiyor. C makine diline daha yakın olduğu doğal olarak kodlaması zor. Ama bence C ‘de veri yapılarını kavramış bir insan diğer dillerde hiç ama hiç zorlanmaz. Sonuçta Pointer kavramı C ve C++ ‘ta karşımıza çıkıyor. Üst düzey diller olan Java, C# gibi programlama dillerinde gerçek anlamda bir pointer kavramı yok, ve işleler çok daha basit bir şekilde halledilebiliyor. Ama programcılığı gerçek manada öğrenmek istiyorsanız ve ufkunuzu genişletmek istiyorsanız en azından veri yapılarını C ‘de kodlayabilmeniz şart.

Bugün Veri Yapılarının temel konularından olan Stack (Yığın) kavramına göz atacağız. Bir yığın nedir, nerelerde kullanılır , nasıl çalışır sorularına cevap bulacak ve örnek yığın kodu ile makeleyi sonrandıracağım.
Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

C Programlama : Pointer Ve Dizi İlişkisi

Göstericilerle çalışmak zordur, göstericileri  eğer programlama başlarken  iyice sindirmezseniz muhtemelen daha sonra göstericileri kullanarak bir şeyler geliştirmek oldukça zor olacaktır.  Bu yazımda göstericilere  giriş olması açısından Pointer ve dizi ilişkisi adına bir şeyler yazacağım. Öncelikle gösterici nedir , ne işe yarar ?  Gösterge değişkenler ( Pointer)  bir değişkenin adresini tutan bir değişkendir. Örneğin biz  C  Programlama dilinde

int a  =5 ;   gibi bir tanımlama yaptığımızı düşünelim.       Pointer dediğimiz değişkenler bu a değişkenin değerine ulaşmak için direk a  değişkenini adresini kullanırlar  ve bu yöntem klasik yönteme göre çok daha hızlı ve performanslıdır.    Bu yüzden özellikle bir program geliştirirken ve büyük özellikle büyük verilelerle çalışan programlar çalışırken  pointer değişkenlerini kullanırız.   Tahmin edebilirsiniz ki bu hızı kazanırken bir şeylerden feragat ediyoruz kolaylık.   Dizi değişkenlerle çalışmak  , pointerlarla  çalışmaktan daha zordur.    Pointer değişkenler bu yüzden öğrenilmesi zaman alan , yada söyle diyelim öğrenildiği zannedilen ama pratikte kullanılmadığı sürece öğrenilmeyen bir kavramdır.
Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Java Programalama : Gülen Smiley

Bugün sizlere eğlenceli bir o kadarda öğretici bir uygulama paylaşmak istiyorum.  Bildiğiniz gibi Java  uçsuz bucaksız bir deniz. İstediğiniz herşeye bir çözüm bulmak Java’da mümkün. Fakat bu sonsuzluk Java’yı öğrenmeyi zorlaştırmıyorda değil. Standart Java öğrenerek Java biliyorum  diye ortada gezinen o kadarda çok insan varki. Okullarda bize öğretilen sadece Standart Java ve Nesneye Yönelik Programlama  kavramı malesef. Gerisini getirmek bize kalıyor. Java biliyorum demek için Standart Java öğrendikten sonra çok şey daha öğrenmek gerektiğini düşünüyorum ve bunun içinde çalişmalarıma devam ediyorum 🙂  Takip ettiğim kitapların bir tanesinde bölüm sonu uygulaması olarak  yapılması istenen bir soruyu paylaşmak istiyorum.

Uygulamada Java grafik arayüzünü (GUI)  kullanarak bizde bir gülen smiley yapılması isteniyor.  Tam olarak aşağıda ki fotoğrafa benzer bir çıktı üretilmemiz isteniyor.


Devamını Oku

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS