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

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

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

Java Programlama : Sayıdaki En Büyük Rakamın Kaç Defa Geçtiğini Bulma

Bugün Java için kullandığım kaynakların bir tanesinde karşımda çıkan bir  problemin çözümünü buradan paylaşmak istiyorum.  Soru tam olarak şu şekilde  :

 

Kullanıcı klavyeden bir sayı girecek , bu  girilen sayıdaki en büyük rakamı , ve bu en büyük rakamın girilen sayıda kaç defa geçtiğini bulan programı yazacağız.  Kitap bu tip problemleri sınıflandırmış. Sorulara 1,2 ve 3 yıldız şeklinde numaralar vermiş. 1 yıldızlık sorular basit, 2 yıldızlık orta seviye , 3 yıldızlık sorular ise daha çok düşünmeye sevk edici sorulardan oluşuyor. Görüldüğü üzere yazar bu soruya 2 yıldız vermiş ve çözülmeye değer bir soru olarak öngörmüş.

Bu sorunun mutlaka birden fazla çözümü olabilir, ben  çözümümü bu şekilde oluşturdum. MaxBul isimli bir sınıf oluşturdum. Bu sınıfın  maxBul ve  kactaneVar isimli iki static üyesi var. maxBul ( kücük harfle yazılan) isimli metod kullanıcının girdiği sayıda ki en büyük  rakamı bulur.  kactaneVar isimli metod ise bulunan  rakamın belirtilen rakamın o sayıda kaç tane olup olmadığını kullanıcıya mesaj eder.

Kullanıcının aşağıdaki sayıyı girdiğini varsayalım :

Lütfen bir sayı giriniz :  1245801989

Kullanıcı yukarıdaki gibi bir giriş yaptığında porgramın çıktısı şu şekilde olacaktır.

Devamını Oku

Share and Enjoy

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

Java Programlama : İki Basamaklı bir Sayının Rakamlarını Bulma

Bugünkü uygulamızda da basit bir öğretici oyun yapacağız.  Program  iki basamaklı bir sayı üretecek  ve kullanıcıya bu iki basamaklı sayının rakamları toplamının kac olduğunu soracak . Ve program sonlandığında tahmin edilen toplam ile   olması gereken toplam karşılaştırılacak ve sonucun doğru olup olmadığı ekrana mesaj edilecek.

Programı yazmaya başlamadan önce bilmemiz gereken bir iki nokta var.  Java ‘da  rastgele sayılar üretebilmek için  birden çok yöntem var  biz bu programda Math kütüphanesinin Random isimli methodunu kullanacağız. Math.Random() metodu    0 ile 1 arasında rasgele  değerler üretir. Dikkat edilmesi gereken nokta bu  üretilen değerin bir tam sayı değil   virgüllü bir sayı olduğudur. Bu nedenle üretilen değeri tam sayı tipine cevirmemiz gerekmektedir.   Bu işi en kolay biçimde type casting (tip dönüşümü) ile yapabiliriz. Tip dönüşümüne örnek vermek gerekirse :

Devamını Oku

Share and Enjoy

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

Java ortamından bir Windows Uygulamasını Çalıştırmak

Bazen yazdığımız programlarda  her hangi bir Windows uygulamasını çalıştırmak isteyebiliriz. Bu çoğunlukla beklenen bir durumdur.  Diyelim ki bir program yazdık ve  kullanıcının hesap makinesine ihtiyacı oluyor. Eğer kullanıcıyı uğraştırmak istemiyorsanız direk yazdığınız program üzerine ufak bir buton ekleyerek  ve Windows’un  hesap makinesi exe uygulmasını kullanarak bunu rahatlıkla yapabilirsiniz. Örnek olması açısından Java platformu üzerinden her hangi bir Exe uygulamasını nasıl başlatabileceğimizi bir örnekle açıklamak istiyorum..

Senaryo :   Yazdığımız bir program üzerinden Windows Not defteri uygulamasını direk olarak çalıştırmak istediğimizi varsayalım.

Java ortamı üzerinden windows uygulamalarını çalıştırabilmek için bilmemiz gereken ufak bir iki şey var.  Bunlarda ilki Runtime sınıfı. 
Devamını Oku

Share and Enjoy

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

Java Applet : Fotoğraf Albümü

Fırsat buldukça Java ve Java Uygulamaları ile ilgili  yazı girmeye devam ediyorum.  Bu paylasağım uygulama bir  Fotoğraf albümü uygulaması.  Bu uygulamayı yaparken  Java Appletlerinden , Canvas sınıfından, Buton tipi nesnelerden,  ve butonların tıklama olaylarını kontrol edebilmek için Action Listener’dan yararlandık.

Fotoğraf Albümü aşağıdaki gibi şey olacak tam olarak 🙂


Canvas sınıfı Java üzerinde 2D çizim işlemleri yaparken  yararlandığımız sınıflardan bir tanesidir.  Canvas ile ayrıntılı bilgiyi Oracle’nin sitesinde tam olarak burada mevcut.  Biz bu Canvas nesnesini üzerine fotoğraflarımızı yerleştirmek için kullanacağız.

Bu işlemleri  yaptıktan sonra fotoğraflarımızı programımıza çekmemiz gerekiyor birden fazla fotoğraf çekeceğimizi hesap ediyoruz, bu yüzden bir dizi tanımlamamız lazım. Peki bu dizinin türü ne olmalı ?  Nesne Yönelimli dillerde bu tür şeyler için kolayca  çözümler bulunabilir. Java ‘da bir fotoğrafı  tutmak için kullanabileceğimiz sınıfıdır. Sınıf ile ilgili ayrıntılı dokumantasyona   buradan erişebilirsiniz.   Birden fazla fotoğraf tutmak için Image türünde bir  dizi tanımlaması yapmamız gerekiyor.

Bu  işlemide tamamladıktan sonra artık Java Appletimizi  yazmaya başlayabiliriz. Bildiğiniz üzere bir Java Applet çalışırken ilk olarak  onun init()  isimli metodu çalişir. Bu metod appletin açılışta alacağı özellikleri belirleyebildiğimiz bir metoddur. Bu kısımla ilgili ayrıntılı açıklamayı Kod kısmında bulabilirsiniz.

Fotoğraflarımızı Image nesnemize eklerken yerini tam olarak bildirmek için getCodeBase() isimli metodu kullandık.  getCodeBase() metodu appleti içeren dizini gösteren stringi geri dönüş değeri olarak verir.

Devamını Oku

Share and Enjoy

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