Yazilar:

 Sponsor Reklam 


23.11.2008 (00:21)

 Konsoldan Girilenleri, Karakteri ve Satırı Okumak 
Girdiğimiz karakterlerin veya karakterler dizisinin okunmasını istiyorsak giriş akışlarını (input streams) ve bu akışlardan yararlanabilmek için tamponlu okuyucuları (buffered readers) ve onların sınıflarını kullanmalıyız.

Konsolden karakter veya karakter dizisi okumak için şu örneği kullanabiliriz:

Main.java:
package kodcu.net;

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws IOException {
    // System.in araciligi ile konsoldan girilenleri alalim
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String satir;
    char karakter;
    // Satir ve karakter okumasi yapalim
    satir = br.readLine();
    karakter = (char) br.read();
    System.out.println("Satir: " + satir);
    System.out.println("Karakter: " + karakter);
  }
 
}

readLine() metodu ile satır okuması yapılırken read() metodu ile karakter okuması yapılmıştır. Burada karakter okurken karakterin integer karşılığı verilmekte ve biz de karakteri normal yazdırmak istediğimizden char ile cast işlemi yapmaktayız. Bu noktaya dikkat edilmelidir.

Konsol girdisi ve çıktıları şunlar:
deneme
q
Satir: deneme

Karakter: q

Imza: admin

19.11.2008 (19:42)

 InternetExplorer Sayfası Açma Programı 
Swing paketinin JFrame ve JButton'unu kullanarak programı basit bir görsellikle hazırlayalım. Buton'a basınca yeni bir internet explorer sayfası (page) açıp siteye bağlansın.

package kodcu.net;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.io.IOException;

public class Main extends JFrame implements ActionListener {

  public Main(){
    // buton olusturalim
    JButton button = new JButton("Go www.kodcu.net");
    button.addActionListener(this);
    // bir alan olusturalim
    Container contentPane=getContentPane();
    contentPane.setLayout(new FlowLayout());
    // bu alana butonu ekleyelim
    contentPane.add(button);
    setBounds(200,200,200,200);
    setVisible(true);
  }
 
  public static void main(String args[]){
    new Main();
  }
 
  public void actionPerformed(ActionEvent e){
    // tiklama gerceklesince yapilacak islemleri belirleyelim
    try{
      Process p = Runtime.getRuntime().exec("C:\\\\Program Files\\Internet Explorer\\IEXPLORE.exe www.kodcu.net");
      System.exit(0);
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }
}

İşlem daha önce yaptığımız not defteri açma programı gibi çalışma zamanı esnasında gerçekleşecektir.
Imza: admin

13.11.2008 (20:41)

 Not Defteri (NotePad) Açma Programı 
Uygulama sırasında Not Defteri (NotePad) açmak istersek şu kodu kullanabiliriz:

package kodcu.net;

import java.io.IOException;

public class Main {

  public static void main(String args[]) {

    try {
      // notepad is opening in run time.
      Runtime.getRuntime().exec("notepad.exe");
    } catch (IOException ex) {
      //exception handling
    }

  }

}

Imza: admin

11.11.2008 (07:13)

 Ekran Görüntüsü Alma Programı 
Ekran görüntüsü almak için şu koddan faydalanabilirsiniz. Program çalıştığı anda belirlenen genişlik (width) ve yüksekliğe (height) göre o anki ekran görüntüsünü alır ve JPG formatında C:// dizinine output.jpg olarak kaydeder.

ScreenShotDemo.java:
package kodcu.net;

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.awt.AWTException;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ScreenShotDemo {

  public static void main(String[] args) {
    try {
      // Robot sinifi ekran goruntusu almamiza yariyor
      Robot robot = new Robot();
      // 600X600 piksel boyutlarinda ekran goruntusu alalim
      BufferedImage bi = robot.createScreenCapture(new Rectangle(600,600));
      // JPG formatinda yazalim
      ImageIO.write(bi, "jpg", new File("C:/output.jpg"));
    } catch (AWTException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

Imza: admin

04.11.2008 (21:04)

 Dizi Aşımı Derleyici Hatası 
Bildiğimiz üzere Java'da Exception sınıfını genişleten ArrayIndexOutOfBoundsException sınıfı dizi sınırı aşımlarında çalışma zamanı hatasını (run time error) yakalar. Fakat bu durum derleyiciye bağlı olarak değişmektedir.

512X512'lik bir integer matrisinde -1. indisten 512. indis dahil olmak üzere tutulan değerler toplanmak istendiğinde try-catch mekanizması ile her satır için 2 defa (-1 ve 512. indislerde) ArrayIndexOutOfBoundsException oluşmalı ve yakalanmalıdır. Fakat NetBeans'te sorun çıkmazken JBuilder'da Heap ile ilgili sorun çıkmakta ve şu çıktıyı vermektedir:

Unexpected Signal : EXCEPTION_FLT_STACK_CHECK (0xc0000092) occurred at PC=0xCCBBD2
Function=[Unknown.]
Library=(N/A)

NOTE: We are unable to locate the function name symbol for the error
      just occurred. Please refer to release documentation for possible
      reason and solutions.


Current Java thread:

Dynamic libraries:
0x00400000 - 0x00408000 C:\JBuilderX\jdk1.4\bin\javaw.exe
0x7C8F0000 - 0x7C99F000 C:\WINDOWS\system32\ntdll.dll
0x7C800000 - 0x7C8EE000 C:\WINDOWS\system32\kernel32.dll
0x77DC0000 - 0x77E6B000 C:\WINDOWS\system32\ADVAPI32.dll
0x77E70000 - 0x77F01000 C:\WINDOWS\system32\RPCRT4.dll
0x77D30000 - 0x77DC0000 C:\WINDOWS\system32\USER32.dll
0x77F10000 - 0x77F56000 C:\WINDOWS\system32\GDI32.dll
0x77C00000 - 0x77C58000 C:\WINDOWS\system32\MSVCRT.dll
0x00820000 - 0x00893000 C:\DOCUME~1\ZGRMER~1\LOCALS~1\Temp\uqb26.tmp
0x5D5E0000 - 0x5D677000 C:\WINDOWS\system32\COMCTL32.DLL
0x71B10000 - 0x71B22000 C:\WINDOWS\system32\MPR.DLL
0x774D0000 - 0x7760C000 C:\WINDOWS\system32\OLE32.DLL
0x77110000 - 0x7719C000 C:\WINDOWS\system32\OLEAUT32.DLL
0x71AC0000 - 0x71AC9000 C:\WINDOWS\system32\WSOCK32.DLL
0x71AA0000 - 0x71AB7000 C:\WINDOWS\system32\WS2_32.dll
0x71A90000 - 0x71A98000 C:\WINDOWS\system32\WS2HELP.dll
0x08000000 - 0x08136000 C:\JBuilderX\jdk1.4\jre\bin\client\jvm.dll
0x76B30000 - 0x76B5D000 C:\WINDOWS\system32\WINMM.dll
0x10000000 - 0x10007000 C:\JBuilderX\jdk1.4\jre\bin\hpi.dll
0x00A60000 - 0x00A6E000 C:\JBuilderX\jdk1.4\jre\bin\verify.dll
0x00A70000 - 0x00A88000 C:\JBuilderX\jdk1.4\jre\bin\java.dll
0x00A90000 - 0x00A9D000 C:\JBuilderX\jdk1.4\jre\bin\zip.dll


****************
Another exception has been detected while we were handling last error.
Dumping information about last error:
ERROR REPORT FILE = (N/A)
PC                = 0x00ccbbd2
SIGNAL            = -1073741678
FUNCTION NAME    = (N/A)
OFFSET            = 0xFFFFFFFF
LIBRARY NAME      = (N/A)
Please check ERROR REPORT FILE for further information, if there is any.
Good bye.
0x76C80000 - 0x76CA8000 C:\WINDOWS\system32\imagehlp.dll
0x59CA0000 - 0x59D41000 C:\WINDOWS\system32\DBGHELP.dll
0x77BF0000 - 0x77BF8000 C:\WINDOWS\system32\VERSION.dll
0x76BE0000 - 0x76BEB000 C:\WINDOWS\system32\PSAPI.DLL

Heap at VM Abort:
Heap
def new generation  total 1152K, used 808K [0x10010000, 0x10140000, 0x104f0000)
  eden


JBuilder'da sadece büyük boyutlu diziler değil küçük boyutlu dizilerdeki benzer işlemde de bu duruma raslanabilmektedir. 512X512'lik matriste sınır aşmadan işlem yapılabilmekte fakat aksine 512X4'te sınır aşımı var ise sorun çıkması kafa karıştırıcıdır. Eğer gerçekten de heap seviyesi sorunu, hafıza yetmezliği var ise ilgili ayarlar yapılarak daha fazla hafıza alanı verilmelidir veya farklı derleyicilerde de denemeler yapılmalıdır. Hafıza (heap, stack, memory, jvm) ayarı için buraya bakınız.
Imza: admin

04.11.2008 (04:59)

 Java'da Heap Seviyesi, Stack Artımı, JVM Ayarı 
Java'da hafıza (memory) sıkıntısı çekeceğimiz durumlar olabilir. Bu durumda OutOfMemoryError hatası alabiliriz. Başlangıç değeri olarak Java Sanal Makinesi (Java Virtual Machine) dahilinde bir minimum hafıza değeri ve maksimum hafıza değeri belirlenmiştir. Derleyiciye göre, java yazılımına göre bu değer değişmektedir. İstediğimiz miktarda hafıza paylaşmak (memory allocation) istiyorsak komut satırı üzerinden java programını minimum için -Xms[miktar]m parametresi ile maksimum için -Xmx[miktar]m parametresi ile çağırmamız gerekmektedir. Örnek olarak min 128MB için ve max 512MB için çalıştırılması gereken komut şudur:

java -Xms128m -Xmx512m

Heap seviyesi değişikliği veya stack artımı RAM'in kapasitesi düşünülerek yapılmalıdır.
Imza: admin

01.11.2008 (19:38)

 Math Sınıfı ve Matematiksel Fonksiyonlar 
Math sınıfı ile çeşitli matematiksel işlemleri yapabiliriz. Matematiksel işlemler için yer alan bazı metotlar şunlardır:

* Mutlak değer alma (abs()),
* Sinüs-kosinüs-tanjant alma (sin(), cos(), tan()),
* Arctan-arcsin-arccos alma (atan(), asin(), acos()),
* Aşağı yuvarlama (floor()),
* Yukarı yuvarlama (ceil()),
* Normal yuvarlama (round()),
* Logaritma alma (log(), log10()),
* Maksimum bulma (max()),
* Minimum bulma (min()),
* Kuvvet alma (pow()),
* Karekök alma (sqrt()),
* Radyanı dereceye çevirme (toDegrees()),
* Dereceyi radyana çevirme (toRadians())

Ayrıca bu sınıftaki sabitler ise double tipli PI ve E sayılarıdır. Değerleri şunlardır:

PI : 3.141592653589793
E : 2.718281828459045

Imza: admin

31.10.2008 (05:46)

 Random Sınıfı ile Rasgele Sayılar Üretmek 
Rasgele sayılar üretmek için Random sınıfından veya Math sınıfının random() metodundan yararlanırız. Math sınıfı ile 0 ile 1 arasında rasgele sayılar üretebiliriz. Oysa Random sınıfı ile rasgele int, long, byte, double, float ve hatta boolean sonuçlar üretebiliriz.

Bununla ilgili şu örneklere bakılabilir:

package kodcu.net;

import java.util.Random;

public class Rasgele {
  public static void main(String[] args) {
    // Math sınıfı ile rasgele sayı üretelim
    // Sonuç 0 ile 1 arasında ondalıklı sayı olacak
    System.out.println(Math.random());
    // Random sınıfı ile rasgele sayı üretelim
    Random r = new Random();
    // Sonuç eksili veya artılı tam sayı olacak
    System.out.println(r.nextInt());
    // Sonuç 0 ile 10 arasında tam sayı olacak
    System.out.println(r.nextInt(10));
  }
}

Bu kod için üretilen rasgele sayılar şunlardır:

0.45050654316562566
1934910901
7

Imza: admin

29.10.2008 (04:24)

 Hashtable Kullanımı 
Daha önce ArrayList'ten ve Vector kullanımından bahsetmiştik. Anahtar ve değer çiftlerini Hashtable hash tablosunda saklar. Vector'lerde olduğu gibi senkronizedir.

Hash tablosunda her anahtara karşılık bir değer (value) bulunmaktadır. Bu değerler saklamak istediğimiz objelerdir. Anahtarlar (keys) ise eşsiz (unique) objelerdir ve birbirlerinden farklı olmak zorundadır. Çünkü her anahtar kendine bağlı değere ulaştırmalıdır. Ayrıca her anahtar saklanırken hashleme (hashing) işleminden geçirilmektedir ve elde edilen sonuç depolanan nesnenin adresi veya indeksidir.

Vector ve ArrayList'te gibi Hashtable da util paketinin (koleksiyonlar çatısının, collections) bir sınıfıdır. Bu sınıf contains(Object), containsKey(Object), containsValue(Object), elements(), get(Object), isEmpty(), keys(), rehash(), remove(Object), size() gibi metodları içerir. Ayrıca put(Object, Object) metodu ile anahtar-değer çiftlerini tabloya eklenir.

Hashtable kullanımı ilgili şu örneğe bakalım:

package kodcu.net;

import java.util.Hashtable;
import java.util.Enumeration;

public class HashtableTest {

  public static void main(String[] args) {
    // Hashtable oluşturalım
    Hashtable telephone = new Hashtable();
    // Değerler ekleyelim
    telephone.put("02120000000", "Ahmet Demir");
    telephone.put("02121111111", "Ahmet Işık");
    telephone.put("02122222222", "Ahmet Demir");
    telephone.put("02123333333", "Baki Ufuk");
   
    // Enumeration kullanarak anahtar ve değerleri yazdıralım
    Enumeration telephoneEnum = telephone.keys();
    String key;
    String value;
    while (telephoneEnum.hasMoreElements()) {
      key = (String) telephoneEnum.nextElement();
      value = (String) telephone.get(key);
      System.out.println(key + " " + value); 
    }
  }

}

Ekran çıktısı şu şekildedir:

02120000000 Ahmet Demir
02121111111 Ahmet Işık
02122222222 Ahmet Demir
02123333333 Baki Ufuk

Anahtarlar (telefon numaraları) görüldüğü gibi birbirinden farklı iken değerler (isimler) aynı olabilmektedir.

Vector kullanımında olduğu gibi Enumeration'dan faydalanırken keys() yerine
telephoneEnum = telephone.elements();
şeklinde elements() metodundan da yararlanabiliriz. Fakat Vector'lerde olduğu gibi Enumeration yerine Iterator'ü doğrudan kullanamayız. Set (küme) sınıfından yararlanarak şu şekilde kullanabiliriz ve yukarıdaki ekran görüntüsünün aynısını alabiliriz:

Set telephoneSet = telephone.keySet();
Iterator telephoneIterator = telephoneSet.iterator();
while (telephoneIterator.hasNext()) {
  key = (String) telephoneIterator.next();
  System.out.println(key + " " + telephone.get(key));
}

Bu kodun çalışması için tabii Set ve Iterator sınıflarının da import edilmiş olması gerekmektedir.
Imza: admin

22.10.2008 (04:46)

 Sıralı Dizilerde İkili Arama (Binary Search) 
Daha önce dizileri sıralamak için şurada Arrays sınıfının sort() metodundan faydalanmıştık. Dizilerde bir başka sıkça kullandığımız işlem de dizinin değerleri içinde arama yapmaktır. Bu amaçla Arrays sınıfında yer alan binarySearch() metodlarını kullanabiliriz. Bu ikili arama metodlarını kullanmak için dizinin sıralı olması gerekmektedir. Eğer dizi sıralı değil ise sort() metodunu kullanarak sıralama yapabiliriz.

Sıralı bir dizide ikili arama yapmak aradığımız sayıya hızlı bir şekilde ulaşmamızı sağlayacaktır. Eğer sıralı bir dizide 10 adet sayı varsa en kötü ihtimal ile 4 adımda sayıyı bulacaktır. Benzer olarak 500000 elemanlı bir dizide istenen sayıya ulaşma en kötü ihtimalle 19 adımda gerçekleşecektir. Binary Search (ikili arama) görüldüğü gibi ciddi oranda arama uzayını küçültmekte, arama programının karmaşıklığını azalatmaktadır.

Adım sayısının en kötü ihtimalini şu formülle bulabiliriz:
N: Dizinin eleman sayısı olsun
O(N): N elemanlı dizinin karmaşıklığı (en kötü ihtimalli adım sayısı) olsun

O(N)=(logN) + 1'dir. Buradaki logaritma 2 tabanındadır. 10 tabanlı logaritma üzerinden işlem yapılacaksa şu denklem kullanılabilir:

O(N)=((logN) / (log2)) + 1'dir. Buradaki logaritmalar 10 tabanlıdır (burada tam sayı, integer, bölmesi yapılıyor).

Örnek bir ikili arama kodu şu şekildedir:

/**
* Bu metot verilen dizide sayi değişkeninin değerini arar ve
* dizideki yer aldığı indisini bulur
* @param dizi int[] : Sıralı dizimiz
* @param sayi int : Aranacak değer
* @return int : Dizide bulunduğu yer
*/

public int ikiliAra(int[] dizi, int sayi) {
  int index; // elemanın bulunacağı indis
  index = Arrays.binarySearch(dizi, d);
  return index;
}

Yapılan aramada eğer sayı dizide yer almıyor ise bulunamadı anlamında -1 değeri dönülecektir.
Imza: admin

 1  ··  5   6   7  ··  10 








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter